如何在不增加行数的情况下合并多个同维度R数据框?
解决多DataFrame按非NA值合并的问题
行数增加的原因
你遇到的行数膨胀问题,核心是**join类函数不匹配你的需求场景**:这类函数是按匹配键合并行,若原始数据中ID+Coordinates的组合存在隐性重复(哪怕你以为没有),就会触发笛卡尔积匹配导致行数翻倍。而你的需求是填充同位置的非NA值,属于列维度的合并,而非行维度的匹配。
最优解决方案
由于所有DataFrame的行列结构完全一致,仅部分列有非NA值,以下两种方法可以高效实现需求:
方法一:批量合并后提取非NA值(适合多DataFrame场景)
将所有DataFrame放入列表,合并后按分组提取每个变量的第一个非NA值:
library(dplyr) # 统一存放所有DataFrame df_collection <- list(DF1, DF2, DF3) # 合并并提取有效数据 DF4 <- bind_rows(df_collection) %>% group_by(ID, Coordinates) %>% summarize( across(c(Var1, Var2, Var3), ~first(na.omit(.x))), .groups = "drop" )
方法二:逐列合并非NA值(简洁高效)
用coalesce函数直接对每一列的多个DataFrame取值,优先取非NA值:
library(dplyr) DF4 <- tibble( ID = DF1$ID, Coordinates = DF1$Coordinates, Var1 = coalesce(DF1$Var1, DF2$Var1, DF3$Var1), Var2 = coalesce(DF1$Var2, DF2$Var2, DF3$Var2), Var3 = coalesce(DF1$Var3, DF2$Var3, DF3$Var3) )
验证结果
两种方法最终得到的DF4均为:
ID Coordinates Var1 Var2 Var3 1 A 100 <NA> 0 <NA> 2 B 200 20 <NA> 30 3 C 300 <NA> 20 <NA> 4 D 400 <NA> <NA> <NA> 5 E 500 9 0 50
内容的提问来源于stack exchange,提问作者user20330606
相关产品推荐
相关产品推荐

