You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中从两个现有DataFrame生成仅含非共同观测值的新DataFrame

解决R中筛选两个DataFrame不共有观测的问题

嘿,刚好碰到过类似需求,咱们可以通过几种方式实现,核心都是利用Country.Code这个唯一标识来定位两个数据框的差异项。下面给你详细拆解:

方法一:用tidyverse的dplyr包(推荐,代码更直观)

dplyr里的anti_join()函数专门用来提取在第一个数据框中存在,但在第二个数据框中不存在的行。咱们需要分别提取两个方向的差异,再合并起来:

# 先加载dplyr包(如果没装先运行install.packages("dplyr"))
library(dplyr)

# 提取merged中有但merged_2013中没有的行
only_in_merged <- anti_join(merged, merged_2013, by = "Country.Code")

# 提取merged_2013中有但merged中没有的行
only_in_2013 <- anti_join(merged_2013, merged, by = "Country.Code")

# 合并两个差异结果,得到所有不共有的8条观测
unique_obs <- bind_rows(only_in_merged, only_in_2013)
  • anti_join(x, y, by):对比x和y,返回x中那些在y里找不到匹配by列的行
  • bind_rows():把两个结构相同的数据框按行合并,刚好符合咱们的需求

方法二:用Base R原生函数(不需要额外装包)

如果不想加载第三方包,用Base R的%in%运算符和subset()也能搞定:

# 提取merged中独有的行
only_in_merged <- subset(merged, !Country.Code %in% merged_2013$Country.Code)

# 提取merged_2013中独有的行
only_in_2013 <- subset(merged_2013, !Country.Code %in% merged$Country.Code)

# 合并结果
unique_obs <- rbind(only_in_merged, only_in_2013)
  • %in%:判断左侧元素是否存在于右侧向量中,前面加!就是取反(不存在的情况)
  • subset():按条件筛选数据框的行
  • rbind():Base R里的行合并函数,要求两个数据框列名完全一致

方法三:用full_join加筛选(另一种tidyverse思路)

可以先把两个数据框全连接,然后筛选出那些只在其中一个数据框里出现的行:

library(dplyr)

# 全连接两个数据框,保留所有行
full_joined <- full_join(merged, merged_2013, by = "Country.Code", suffix = c("_merged", "_2013"))

# 筛选出只有一侧有数据的行(即不共有的观测)
unique_obs <- full_joined %>%
  filter(is.na(Country.Code_merged) | is.na(Country.Code_2013)) %>%
  # 可以选择保留原数据的列,这里根据需求调整,比如保留merged的列或者合并
  select(Country.Code, everything())

这个方法适合你需要查看两个数据框对应列差异的场景,如果只是要独有的观测,前两种方法更直接。

内容的提问来源于stack exchange,提问作者LMadden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:39:20