R语言如何合并列表中ID相同且行数一致的多个dataframe
实现同ID同行数DataFrame合并的方案
原有代码问题
- 循环中使用
i++会多次修改索引值,导致索引跳转混乱,出现遗漏或重复处理列表元素的问题 - 直接对整列ID做相等判断,属于逐行比较逻辑,不能用来判定两个DataFrame是否属于同一个ID分组
- 直接使用
merge按ID合并时,单个ID对应多行的场景会生成笛卡尔积,行数会翻倍,不符合需求 - 没有对合并结果做存储,也没有按ID统一分组处理所有同ID的DataFrame
实现代码(纯Base R,无需额外依赖)
# -------------------------- # 模拟你的输入数据,可替换成你自己的df列表 df1_ID1 <- data.frame(ID = c(1,1,1), b = c("x","y","z"), c = c("y","z","x"), d = c("z","x","y")) df2_ID1 <- data.frame(ID = c(1,1,1), b = c("x","y","z"), c = c("y","z","x"), d = c("z","x","y")) df3_ID2 <- data.frame(ID = c(2,2,2), b = c("x","y","z"), c = c("y","z","x"), d = c("z","x","y")) df_list <- list(df1_ID1, df2_ID1, df3_ID2) # -------------------------- # 1. 按每个DataFrame的唯一ID值对列表元素分组 grouped_df <- split(df_list, sapply(df_list, function(x) unique(x$ID))) # 2. 遍历每个ID分组完成合并 result <- lapply(grouped_df, function(df_group) { # 检查同组所有DataFrame行数是否一致,不一致则跳过该分组 row_counts <- sapply(df_group, nrow) if (length(unique(row_counts)) != 1) { return(NULL) } # 合并逻辑:保留第一个DataFrame的ID列,其余df去掉ID列后按列拼接 merged_df <- df_group[[1]] for (i in 2:length(df_group)) { merged_df <- cbind(merged_df, df_group[[i]][, setdiff(colnames(df_group[[i]]), "ID")]) } return(merged_df) }) # 3. 过滤掉行数不一致的无效分组 result <- Filter(Negate(is.null), result)
结果说明
运行完成后,result是按ID命名的列表,比如你示例中的ID1合并结果可以通过result[["1"]]获取,输出和你要求的预期完全一致:
ID b c d b c d 1 1 x y z x y z 2 1 y z x y z x 3 1 z x y z x y
内容的提问来源于stack exchange,提问作者Mrs. PDM
相关产品推荐
相关产品推荐

