R语言合并dataframe且不产生重复项的解决方案咨询
R语言重复键数据框合并方案
当两个待合并的数据框存在重复主键时,若直接使用常规合并逻辑会生成笛卡尔积,可通过给同主键分组内添加行序号、再按主键+行序号联合匹配的方式实现按顺序合并。
样例数据构造
# 对应重复键合并场景的测试数据 df1 <- data.frame( key = c("a", "a", "b", "c", "c", "c"), value1 = c(1, 2, 3, 4, 5, 6) ) df2 <- data.frame( key = c("a", "a", "b", "b", "c"), value2 = c("x", "y", "m", "n", "p") )
实现方法
方法1:基础R实现
无需额外安装依赖包:
# 为每个主键分组内的行添加顺序编号 df1$rowid <- ave(df1$key, df1$key, FUN = seq_along) df2$rowid <- ave(df2$key, df2$key, FUN = seq_along) # 按主键+行号联合合并 merge_res <- merge(df1, df2, by = c("key", "rowid"), all.x = TRUE) # 删除临时生成的行号列 merge_res$rowid <- NULL
方法2:dplyr实现
代码更简洁,适合tidyverse生态用户:
library(dplyr) merge_res <- df1 %>% group_by(key) %>% mutate(rowid = row_number()) %>% ungroup() %>% left_join( df2 %>% group_by(key) %>% mutate(rowid = row_number()) %>% ungroup(), by = c("key", "rowid") ) %>% select(-rowid)
两种方法最终都可以实现同主键分组内按行顺序匹配合并,避免生成无效的笛卡尔积结果,若某一数据框内的同主键行数更多,多出行对应的另一数据框字段会自动填充NA。
内容的提问来源于stack exchange,提问作者Katharina
相关产品推荐
相关产品推荐

