R语言如何合并结构一致存在行重叠的数据框实现匹配值覆盖
R中按指定规则合并两个重叠数据框
已知两个数据框列名一致、姓名存在重叠,合并时需全量保留所有唯一姓名,重名记录优先取b中的年龄值,可通过以下两种方式实现:
方案1:基础R实现(无需安装额外包)
逻辑直接,运行效率高:先剔除a中与b重名的记录,再将处理后的a与全量b按行拼接即可。
# 初始化原始测试数据 a = data.frame(c("Joe","Bill","Frank"), c("30","31","")) b = data.frame(c("Frank","Chuck"), c("32","40")) names(a) = c("name","age") names(b) = c("name","age") # 过滤a中已经在b里存在的姓名记录 a_filtered <- a[!a$name %in% b$name, ] # 按行拼接得到结果 result <- rbind(a_filtered, b) # 可选:重置行名,优化输出格式 rownames(result) <- NULL
运行后输出的结果完全符合要求:
name age 1 Joe 30 2 Bill 31 3 Frank 32 4 Chuck 40
方案2:dplyr实现(适配tidyverse数据处理流)
如果平时习惯用dplyr做数据处理,可以用分组切片的方式写,代码可读性更强:
library(dplyr) result <- bind_rows(a, b) %>% group_by(name) %>% # 按行拼接时b的记录排在a之后,同姓名取最后一条即为b的对应值 slice_tail(n = 1) %>% ungroup()
小提示:如果后续需要调整优先级,只要调换
bind_rows()里两个数据框的传入顺序即可,排在后面的表重名记录会覆盖前面的。
内容的提问来源于stack exchange,提问作者Charles Stangor
相关产品推荐
相关产品推荐

