如何在R语言列表中找出相同的dataframe元素?
在R语言中找出列表中相同的DataFrame元素
示例数据
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)))
需求说明
将列表中完全相同的DataFrame归为一组,输出它们的名称,期望结果如下:
List2 <- list(c("A","E","G"),c("B","C")) # 即A、E、G完全相同,B和C完全相同
简便实现方法
方法1:Base R + digest包
通过生成每个DataFrame的哈希值判断一致性,再按哈希值分组:
# 首次使用需安装digest包 # install.packages("digest") library(digest) # 为每个列表元素生成唯一哈希标识 hash_ids <- sapply(List1, digest) # 按哈希值分组,提取对应的列表名称 result <- split(names(List1), hash_ids) # 过滤仅含单个元素的组(若无需保留独有的元素) result <- result[sapply(result, length) > 1]
方法2:Tidyverse 语法(dplyr + purrr)
适合熟悉tidyverse生态的用户,通过数据框分组实现:
library(tidyverse) result <- List1 %>% # 将列表转换为包含名称和DataFrame的 tibble imap_dfr(~ tibble(name = .y, data = list(.x))) %>% # 按DataFrame内容分组 group_by(data) %>% # 只保留元素数量大于1的组 filter(n() > 1) %>% # 合并每组的名称为列表 summarise(group_names = list(name)) %>% # 提取最终的分组列表 pull(group_names)
以上两种方法都能快速得到符合需求的分组结果,其中digest方式在处理大型列表时效率更优。
内容的提问来源于stack exchange,提问作者l0110
相关产品推荐
相关产品推荐

