如何基于两列识别数据框内部及跨数据框的重复行
找出两个数据框间共享的state-name组合行
以下是几种在R中实现该需求的实用方法:
方法1:使用基础函数merge()
merge()可以直接按指定列匹配两个数据框,提取共同行:
# 按state和name列匹配,保留两个数据框的所有列 common_rows <- merge(ppl, ppl_2, by = c("state", "name")) print(common_rows)
执行后会输出两个数据框中state和name完全一致的行(也就是你要找的TN Ruby组合),两个数据框的id列会分别以id.x和id.y区分。
方法2:用dplyr的半连接筛选
如果你常用tidyverse工具链,dplyr的semi_join()是更简洁的选择,它只保留左侧数据框中在右侧数据框存在匹配的行:
library(dplyr) # 从ppl中筛选出在ppl_2有相同state和name的行 match_ppl <- semi_join(ppl, ppl_2, by = c("state", "name")) # 从ppl_2中筛选对应匹配行 match_ppl2 <- semi_join(ppl_2, ppl, by = c("state", "name")) # 查看结果 print(match_ppl) print(match_ppl2)
方法3:手动生成匹配键筛选
如果不想加载额外包,可以通过拼接列生成唯一标识来判断:
# 为每个数据框生成state+name的组合键 ppl$key <- paste(ppl$state, ppl$name, sep = "_") ppl_2$key <- paste(ppl_2$state, ppl_2$name, sep = "_") # 找出两个数据框共有的键 shared_keys <- intersect(ppl$key, ppl_2$key) # 筛选出对应行 result_ppl <- subset(ppl, key %in% shared_keys) result_ppl2 <- subset(ppl_2, key %in% shared_keys) # 查看结果 print(result_ppl) print(result_ppl2)
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

