我有两个非常大的列表(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)
。您对此有一个好的方法吗?非常感谢!
答案 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"