Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何从向量列表中删除共享值_R_List_Vector - Fatal编程技术网

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个对象)

x
x您可以在列表上按相反顺序使用
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