如何从向量列表中删除共享值

Noo*_*oor 1 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
Run Code Online (Sandbox Code Playgroud)

列表中的每个向量与其他向量共享许多元素.如何删除共享值以获得以下结果?

 $a
    [1]  1  2  3  4  5  6 32 24

    $b
    [1]  8 10 12 13 17

    $F
    [1]   9  11  14 15 18 19 20
Run Code Online (Sandbox Code Playgroud)

如您所见:第一个向量不会改变.第一和第二矢量之间的共享元素将从第二个矢量中移除,然后我们将它与第一和第二矢量进行比较后从第三个矢量中删除共享元素.此任务的目标是聚类数据集(原始数据集包含590个对象).

Jam*_*mes 5

您可以使用Reduce,并setdiff以相反的顺序名单上发现,不会出现在其他人的最后一个向量的所有元素.将其添加到一个lapply部分子列表中以获得所需的输出:

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
Run Code Online (Sandbox Code Playgroud)

向上扩展时,rev调用次数可能会成为一个问题,因此您可能希望将列表反转一次,在lapply新变量之外,以及在其中的子集.