full_join后缺失数据点:如何合并重复列并保留全部数据?
解决数据框合并后同名列拆分的问题
为啥会出现.x/.y后缀?
当你用full_join(df1, df2, by=c("Sample Description", "Group"))时,两个数据框里名字相同但不在by参数中的列,会被自动加上.x(来自df1)和.y(来自df2)的后缀——这是full_join的默认行为,用来区分列的来源,但不会自动合并这些列的数值。至于你提到32-71行的C0等数据没被纳入,大概率是这些行的Sample Description或Group在另一个数据框里没有完全匹配的条目,合并后这些行的对应.x或.y列显示为NA,看起来像是没被纳入,实际是存在的。
怎么合并这些同名列?
1. 批量合并所有.x/.y列
用dplyr的coalesce函数可以把两组同名后缀列合并成一列,自动保留非NA的值。结合across能批量处理所有这类列,不用手动逐个操作:
library(dplyr) # 提取所有带.x后缀的列名,去掉后缀得到原始列名 common_cols <- names(df3)[grepl("\\.x$", names(df3))] %>% gsub("\\.x$", "", .) # 批量合并每组.x和.y列,生成新列后删除原后缀列 df3_merged <- df3 %>% mutate(across(all_of(common_cols), ~ coalesce(!!sym(paste0(.name, ".x")), !!sym(paste0(.name, ".y"))))) %>% select(-ends_with(".x"), -ends_with(".y"))
2. 排查连接键的匹配问题
如果确实有行没出现在df3里,先检查连接键的格式是否有差异,比如空格、大小写、特殊字符导致匹配失败:
# 查看df1里在df2中没有匹配的键 anti_join(df1, df2, by = c("Sample Description", "Group")) %>% select("Sample Description", "Group") # 查看df2里在df1中没有匹配的键 anti_join(df2, df1, by = c("Sample Description", "Group")) %>% select("Sample Description", "Group")
找到不匹配的键后,先统一清洗(比如用str_trim去空格、str_to_lower转小写),再重新执行full_join。
3. 自定义后缀(可选)
要是觉得默认的.x/.y不好区分,合并时可以自定义后缀,方便后续识别:
df3 <- full_join(df1, df2, by = c("Sample Description", "Group"), suffix = c("_from_df1", "_from_df2"))
内容的提问来源于stack exchange,提问作者Cecilie Pedersen
相关产品推荐
相关产品推荐

