如何合并含共同ID列但行列不完全共享的DataFrame列表
解决方案
方法一:使用dplyr包
你的数据特点是:每个DataFrame要么和其他DF共享ID但拥有全新列,要么拥有全新ID和全新列,不会出现同一ID对应不同DF中同一列的不同值的情况,因此可以先按行合并所有DF,再按ID聚合保留非NA值:
library(dplyr) # 按行合并所有DataFrame combined_df <- bind_rows(dflist) # 按ID分组,对每一列保留第一个非NA值(同一ID的不同行中,列不会有冲突的非NA值) final_df <- combined_df %>% group_by(ID) %>% summarise(across(everything(), ~ first(na.omit(.x)))) %>% ungroup() # 查看结果 print(final_df)
方法二:使用data.table包(大数据量更高效)
如果数据量较大,data.table的处理速度会更有优势:
library(data.table) # 将列表转为data.table并按行合并,自动填充缺失列 combined_dt <- rbindlist(dflist, fill = TRUE) # 按ID分组,提取每一列的非NA值(同一ID无冲突值,取第一个即可) final_dt <- combined_dt[, lapply(.SD, function(x) na.omit(x)[1]), by = ID] # 可选:转换为data.frame格式 final_df <- as.data.frame(final_dt) print(final_df)
原方法失效原因
你之前用Reduce(function(x,y) merge(x,y,by='ID',all.x=T,all.y=T),dflist)出错,是因为当两个DataFrame拥有相同非ID列(比如df1和df2都有A、B列)但ID不重叠时,merge会把这些列拆分为A.x、A.y、B.x、B.y,而非合并成单一的A、B列,不符合你的需求。
内容的提问来源于stack exchange,提问作者W. Kessler
相关产品推荐
相关产品推荐

