合并列表中同名且长度一致的数据框,标记维度不符对象
问题与解决方案
原始数据代码
# 创建list1 a <- rnorm(10, 1, 1) b <- letters[1:10] ab <- cbind.data.frame(a, b) a <- rnorm(10, 1, 1) b <- letters[1:10] cd <- cbind.data.frame(a, b) list1 <- list(ab = ab, cd = cd) # 创建list2 a <- rnorm(11, 1, 1) b <- letters[1:11] ab <- cbind.data.frame(a, b) a <- rnorm(10, 1, 1) b <- letters[10:1] cd <- cbind.data.frame(a, b) list2 <- list(ab = ab, cd = cd)
需求说明
现有两个列表list1和list2,二者均包含名称、列名相同但维度可能不同的数据框。需要实现:
- 若同名数据框行数一致,按指定列(如示例中的
b列)进行匹配合并 - 若行数不一致,记录这些数据框的名称
- 最终输出包含合并后的数据框及差异名称的列表
实现代码
# 指定用于合并的列名 merge_col <- "b" # 初始化结果容器 result_list <- list() mismatch_names <- character(0) # 遍历每个数据框名称 for (df_name in names(list1)) { df_from_list1 <- list1[[df_name]] df_from_list2 <- list2[[df_name]] # 检查行数是否匹配 if (nrow(df_from_list1) == nrow(df_from_list2)) { # 按指定列合并,添加后缀区分不同列表的列 merged_df <- merge(df_from_list1, df_from_list2, by = merge_col, all = TRUE, suffixes = c("_list1", "_list2")) result_list[[df_name]] <- merged_df } else { # 记录维度不匹配的数据框名称 mismatch_names <- c(mismatch_names, df_name) } } # 将维度不匹配的名称加入结果列表 if (length(mismatch_names) > 0) { result_list[["dimension_mismatch"]] <- mismatch_names } # 查看最终结果 result_list
代码说明
- 列表命名:先给
list1和list2的元素命名,确保能精准匹配同名数据框 - 遍历检查:循环每个数据框名称,取出对应的数据框并检查行数
- 合并逻辑:行数一致时,用
merge()按指定列合并,通过suffixes参数区分来自不同列表的同名列,all=TRUE确保保留所有行 - 差异记录:行数不一致时,收集名称到
mismatch_names,最后加入结果列表
内容的提问来源于stack exchange,提问作者procerus
相关产品推荐
相关产品推荐

