如何在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
相关产品推荐
相关产品推荐

