如何从两个列表中删除重复元素(成对)?

时间:2019-08-01 11:57:46

标签: r list

我有两个非常大的列表(13000)元素。我想成对删除重复项,即,如果我们发现与对象j相同,则删除两个列表中的对象i。

函数unique()对于单个列表非常有效,但不能成对使用。

a = matrix(c(50,70,45,89), ncol = 2)
b = matrix(c(45,86), ncol = 2)
c = matrix(c(20,35), ncol = 2)

df1 = list(a,b,c)
df2 = list(a,b,a)

df3 = cbind(df1,df2)

v = unique(df3, incomparables = FALSE)

最后,预期结果将是df1 = list(c)df2 = list(a)。您对此有一个好的方法吗?非常感谢!

2 个答案:

答案 0 :(得分:2)

如果列表的每个组成部分只有一个元素,则可以:

df1 <- list("a", "b", "c")
df2 <- list("a", "b", "a")

comp <- unlist(df1) != unlist(df2)
df1[comp]
[[1]]
[1] "c"

df2[comp]
[[1]]
[1] "a"

这是您要找的吗?

使用purrr的更通用的解决方案(无论列表中有什么)将是:

comp2 <- !purrr::map2_lgl(df1, df2, identical)
df1[comp2]
[[1]]
[1] "c"

df2[comp2]
[[1]]
[1] "a"

答案 1 :(得分:0)

您可以尝试

Filter(length, Map(function(x, y) x[x != y], df1, df2))
#[[1]]
#[1] "c"

Filter(length, Map(function(x, y) x[x != y], df2, df1))
#[[1]]
#[1] "a"