R语言如何通过指定列ID与行名匹配合并两个data.frame
R数据框合并问题解决方法
问题原因
你之前的代码存在两个核心问题:
cbind(df1$Taxa, df2)是按行位置直接拼接,没有根据Taxa值做匹配,且两个数据框行数不一致,无法得到正确结果merge(rownames(df2), df1, by = "Taxa")第一个参数传入的是行名字符向量,不是带Taxa列的数据框,参数类型错误,同时未设置保留df1所有行的参数
解决代码
依赖dplyr包版本
library(dplyr) # 1. 将df2的行名转为Taxa列,按Taxa去重(保留每个Taxa最后一条记录,匹配你的预期输出) df2_unique <- df2 %>% mutate(Taxa = rownames(df2)) %>% group_by(Taxa) %>% slice_tail(n = 1) %>% ungroup() # 2. 左连接合并,保留df1所有行,同时自动维持df1原始顺序 result <- left_join(df1, df2_unique, by = "Taxa")
基础R版本(无需额外安装包)
# 1. 处理df2:行名转Taxa列,去重保留每个Taxa最后一条记录 df2$Taxa <- rownames(df2) df2_unique <- df2[!duplicated(df2$Taxa, fromLast = TRUE), ] # 2. 左连接合并,保留df1所有行 result <- merge(df1, df2_unique, by = "Taxa", all.x = TRUE) # 3. 恢复df1的原始行顺序 result <- result[order(match(result$Taxa, df1$Taxa)), ]
说明
如果df2中同一个Taxa的多条记录你需要保留其他规则的记录,可以调整去重逻辑:比如把slice_tail改成slice_head保留第一条,或者根据实际业务规则筛选即可。
内容的提问来源于stack exchange,提问作者abraham
相关产品推荐
相关产品推荐

