R:找出列表中相同的元素

l01*_*110 4 r list

我想从列表中找到相同的元素。例如,如果列表元素是数据框:

List1 <- list(A=data.frame(id=c("LA","WE","SE"),num=c(1,3,2)),
              B=data.frame(id=c("PO","TD","WW"),num=c(8,1,4)),
              C=data.frame(id=c("PO","TD","WW"),num=c(8,1,4)),
              D=data.frame(id=c("SS","FW","MW"),num=c(2,5,1)),
              E=data.frame(id=c("LA","WE","SE"),num=c(1,3,2)),
              G=data.frame(id=c("LA","WE","SE"),num=c(1,3,2)))
Run Code Online (Sandbox Code Playgroud)

我想要有以下输出:

List2 <- list(c("A","E","G"),c("B","C")) 
#i.e., A, E, G are identical. B and C are identical.
Run Code Online (Sandbox Code Playgroud)

是否有捷径可寻?谢谢!!!

Tho*_*ing 5

你可以尝试下面的代码

> unname(split(names(List1), unlist(lapply(List1, toString))))
[[1]]
[1] "A" "E" "G"

[[2]]
[1] "B" "C"

[[3]]
[1] "D"
Run Code Online (Sandbox Code Playgroud)

  • 也许“vapply”也会更快,即“unname(split(names(List1), vapply(List1, toString, '')))” (3认同)
  • 如果我正确理解,`unlist(lapply(...))` 可以替换为 `sapply` (2认同)

MrF*_*ick 5

比较整个 data.frames 的另一种选择是对它们进行哈希处理并比较哈希值

digests <- sapply(List1, digest::digest)
sets <- split(names(List1), digests)
unname(sets)
# [[1]]
# [1] "A" "E" "G"
# [[2]]
# [1] "D"
# [[3]]
# [1] "B" "C"
Run Code Online (Sandbox Code Playgroud)