R语言:识别DFA独有的ID3并合并两数据框(仅保留共同ID3)
问题排查与解决方案
核心问题定位
你的代码里有个关键错误:所有用到ID2的地方都应该是ID3——你自己也提到是代码误写,这直接导致anti_join没按正确的ID列匹配,自然出不来正确结果。另外,ID3存在重复行的情况,也需要针对性处理。
需求1:找出DFA中存在但DFB中没有的ID3
如果要的是去重后的ID集合(而非包含重复行的原始数据),代码如下:
# 获取两个数据框中去重的ID3集合 dfa_ids <- unique(DFA$ID3) dfb_ids <- unique(DFB$ID3) # 筛选DFA有但DFB没有的ID3 different_ids <- dfa_ids[!dfa_ids %in% dfb_ids]
如果要保留这些ID在DFA中的所有原始行(包括重复行),修正anti_join即可:
# 注意by参数改为正确的"ID3" different_id_rows <- anti_join(DFA, DFB, by = "ID3") # 提取去重后的ID可加这一步: different_ids <- unique(different_id_rows$ID3)
需求2:合并两个数据框,仅保留共有的ID3
用inner_join就能直接实现——它只保留两个数据框中ID匹配的行,自动整合所有列:
# 显式指定by参数确保匹配准确,避免同名列干扰 merged_df <- inner_join(DFA, DFB, by = "ID3")
如果担心重复行导致合并后冗余(比如DFA中同一ID3有多行,DFB中同ID3也有多行,会生成笛卡尔积),可以先对两个数据框按ID3去重再合并:
# 按ID3去重,保留每个ID3的第一行(可根据需求调整保留逻辑) dfa_unique <- DFA %>% distinct(ID3, .keep_all = TRUE) dfb_unique <- DFB %>% distinct(ID3, .keep_all = TRUE) # 合并去重后的数据集 merged_unique_df <- inner_join(dfa_unique, dfb_unique, by = "ID3")
你的原始代码修正版
如果要沿用你原来的思路,只需把所有ID2替换为ID3:
DIFFERENT_IDS <- anti_join(DFA, DFB, by = "ID3") my_ID3_N <- as.vector(unlist(DIFFERENT_IDS$ID3)) DFA1 <- DFA[!(DFA$ID3 %in% my_ID3_N),] # 此时DFA1就是DFA中与DFB共有的ID3对应的行
内容的提问来源于stack exchange,提问作者S2068
相关产品推荐
相关产品推荐

