Как удалить дубликаты в списке пар - PullRequest
0 голосов
/ 13 мая 2018

У меня есть вектор, каждый элемент в этом векторе содержит набор пар, как я могу удалить значения NULL, как я могу удалить дубликаты, потому что (3,8) и (8,3) одинаковы в моем случае

N
[[1]]
{<<NULL>>, (3, 8), (3, 9), (8,3)}

[[3]]
{<<NULL>>, (3, 2), (3, 8), (3, 9), (2,3)}

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Я посмотрел в пакет sets.

Предполагая, что N является vector с режимом "list", как вы говорите, вы можете сделать:

N <- list(set(NULL, pair(3, 8), pair(3, 9), pair(8, 3)), set(NULL, pair(3, 2), pair(3, 8), pair(3, 9), pair(2, 3)))
N <- as.vector(N, mode = "list")
N
## [[1]]
## {<<NULL>>, (3, 8), (3, 9), (8, 3)}

## [[2]]
## {<<NULL>>, (2, 3), (3, 2), (3, 8), (3, 9)}

Удалить элемент <<NULL>> каждого набора:

N.cl <- sapply(N, function(s) {s[[NULL]] <- NULL; s})
N.cl

## [[1]]
## {(3, 8), (3, 9), (8, 3)}

## [[2]]
## {(2, 3), (3, 2), (3, 8), (3, 9)}

# =================================================== ======================

Далее я просто покажу, что пытался раньше:

Предполагая, что N является list, вы можете сделать:

require(sets)

N <- list(set(NULL, pair(3, 8), pair(3, 9), pair(8, 3)), set(NULL, pair(3, 2), pair(3, 8), pair(3, 9), pair(2, 3)))

N

дает:

## [[1]]
## {<<NULL>>, (3, 8), (3, 9), (8, 3)}

## [[2]]
## {<<NULL>>, (2, 3), (3, 2), (3, 8), (3, 9)}

Удаление первых элементов набора производится с помощью:

N.cl <- lapply(N, function(s) {s[[NULL]] <- NULL; s})
N.cl

затем дает:

## [[1]]
## {(3, 8), (3, 9), (8, 3)}

## [[2]]
## {(2, 3), (3, 2), (3, 8), (3, 9)}

Альтернативный метод (который я нашел первым) был:

# change the sets first to lists (the order in the set is kept):
N.as.lists <- lapply(N, as.list)

# remove first elements of those lists
N.as.lists.cleared <- lapply(N.as.lists, function(l) l[2:length(l)])

# change the lists to sets
N.cleared <- lapply(N.as.lists.cleared, as.set)

# inspect:
N.cleared

## [[1]]
## {(3, 8), (3, 9), (8, 3)}

## [[2]]
## {(2, 3), (3, 2), (3, 8), (3, 9)}
0 голосов
/ 13 мая 2018

Мы могли бы удалить NULL с помощью unlist элементов, а затем создать set на основе pair с использованием альтернативных элементов

library(sets)
N1 <- lapply(N, function(x) {x1 <- unlist(x)
   do.call(set,Map(pair, x1[c(TRUE, FALSE)], x1[c(FALSE, TRUE)])) })
N1
#[[1]]
#{(3, 8), (3, 9), (8, 3)}

#[[2]]
#{(2, 3), (3, 2), (3, 8), (3, 9)}

Для удаления дубликатов

lapply(N,function(x){ x1 <- unlist(x)
     l1 <- unique(lapply(split(x1, as.integer(gl(length(x1), 2,length(x1)))), sort))
     do.call(set, lapply(l1, function(x) pair(x[1], x[2])))
     })

#[[1]]
#{(3, 3), (8, 9)}

#[[2]]
#{(2, 3), (3, 8), (3, 9)}

данные

N <- list(set(NULL, pair(3, 8), pair(3, 9), pair(8, 3)), 
        set(NULL, pair(3, 2), pair(3, 8), pair(3, 9), pair(2, 3)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...