R 如何从向量列表中删除共享值
我有一份清单:R 如何从向量列表中删除共享值,r,list,vector,R,List,Vector,我有一份清单: x <- list("a" = c(1:6,32,24) , "b" = c(1:4,8,10,12,13,17,24), "F" = c(1:5,9:15,17,18,19,20,32)) x $a [1] 1 2 3 4 5 6 32 24 $b [1] 1 2 3 4 8 10 12 13 17,24 $F [1] 1 2 3 4 5 9 10 11 12 13 14 15 17 18 19 20 32
x <- list("a" = c(1:6,32,24) , "b" = c(1:4,8,10,12,13,17,24),
"F" = c(1:5,9:15,17,18,19,20,32))
x
$a
[1] 1 2 3 4 5 6 32 24
$b
[1] 1 2 3 4 8 10 12 13 17,24
$F
[1] 1 2 3 4 5 9 10 11 12 13 14 15 17 18 19 20 32
如您所见:第一个向量不变。第一个和第二个向量之间的共享元素将从第二个向量中删除,然后我们将在与第一个和第二个向量进行比较后从第三个向量中删除共享元素。此任务的目标是群集数据集(原始数据集包含590个对象)
xx您可以在列表上按相反顺序使用Reduce
和setdiff
查找最后一个向量中未出现在其他向量中的所有元素。将其插入一个lappy
中,运行部分子列表以获得所需的输出:
lapply(seq_along(x), function(y) Reduce(setdiff,rev(x[seq(y)])))
[[1]]
[1] 1 2 3 4 5 6 32 24
[[2]]
[1] 8 10 12 13 17
[[3]]
[1] 9 11 14 15 18 19 20
放大时,rev
调用的数量可能会成为一个问题,因此您可能希望在lappy
之外将列表反转一次,作为一个新变量,和其中的子集。您可以按相反顺序在列表中使用Reduce
和setdiff
,以查找最后一个向量中未出现在其他向量中的所有元素。将其插入一个lappy
中,运行部分子列表以获得所需的输出:
lapply(seq_along(x), function(y) Reduce(setdiff,rev(x[seq(y)])))
[[1]]
[1] 1 2 3 4 5 6 32 24
[[2]]
[1] 8 10 12 13 17
[[3]]
[1] 9 11 14 15 18 19 20
放大时,rev
调用的数量可能会成为一个问题,因此您可能希望在lappy
之外将列表反转一次,作为一个新变量,并将其作为其中的子集。x_rev@andrelrico好的一点,您必须注意索引。我认为tail(x_rev,y)
最有效。x_rev@andrelrico很好,你必须注意索引。我认为tail(x_rev,y)
最有效。
for (i in 2:length(x)) {
## construct union of all previous lists
prev <- Reduce(union,x[1:(i-1)])
## remove shared elements from the current list
x[[i]] <- setdiff(x[[i]],prev)
}
lapply(seq_along(x), function(y) Reduce(setdiff,rev(x[seq(y)])))
[[1]]
[1] 1 2 3 4 5 6 32 24
[[2]]
[1] 8 10 12 13 17
[[3]]
[1] 9 11 14 15 18 19 20