如何在R中基于另一数据框的多变量过滤主数据框?
基于另一数据框的多变量筛选主数据框的方法
原始数据定义
主数据框:
df_root <- data.frame( id = c('1a','1a','2a','2a'), zone = c('II', 'I', 'I', 'II'), date = c(1,6,1,5) )
备选数据框:
df_alternative <- data.frame( id = c('1a', '2a'), date = c(6,5) )
解决方法
方法1:用dplyr的semi_join(推荐)
semi_join专门用来保留主数据框中与另一数据框匹配的行,不会添加额外列,完美适配这种多变量组合筛选的场景:
library(dplyr) df_root_filtered <- df_root %>% semi_join(df_alternative, by = c("id", "date"))
方法2:用dplyr的inner_join
内连接会直接返回两个数据框中id和date同时匹配的行,结果和预期一致:
library(dplyr) df_root_filtered <- inner_join(df_root, df_alternative, by = c("id", "date"))
方法3:Base R原生实现
如果不想加载第三方包,用merge函数做内连接即可:
df_root_filtered <- merge(df_root, df_alternative, by = c("id", "date"))
或者手动生成逻辑索引筛选:
# 逐行检查是否在备选数据框的id-date组合中 match_rows <- apply(df_root[, c("id", "date")], 1, function(x) { any(df_alternative$id == x[1] & df_alternative$date == x[2]) }) df_root_filtered <- df_root[match_rows, ]
最终结果
执行上述任意方法后,得到的df_root_filtered如下:
| id | zone | date |
|---|---|---|
| 1a | I | 6 |
| 2a | II | 5 |
内容的提问来源于stack exchange,提问作者Ramiro Guzmán
相关产品推荐
相关产品推荐

