如何在dplyr中按特定组合过滤匹配另一数据框的观测?
解决R数据框多列匹配筛选问题
我来帮你搞定这个问题!你想要的是从数据框x中筛选出同时匹配y里id和dat组合的观测,这其实是个很常见的多列匹配需求,下面给你两种简单靠谱的实现方法:
首先先明确你的原始数据,方便对照:
x <- data.frame(id = c(1, 1, 2, 2), dat = c("a", "b", "a", "b"), val = 1:4) y <- data.frame(id = 1:2, dat = c("a", "b"))
方法1:用Base R的merge()函数
这是最基础的内置方法,默认就是做内连接,只保留两个数据框中匹配指定列的行:
z <- merge(x, y, by = c("id", "dat"))
运行后得到的z就是你想要的结果:
z
id dat val
1 1 a 1
2 2 b 4
方法2:用dplyr包的semi_join()
如果你习惯用tidyverse的语法,semi_join()是更贴合“筛选”场景的函数——它只会从x中提取在y里有匹配行的观测,不会额外添加列:
library(dplyr) z <- x %>% semi_join(y, by = c("id", "dat"))
这个方法的结果和上面完全一致,而且如果y里有重复行,它也不会像merge()那样重复输出x的行,逻辑更清晰。
为什么你之前的方法可能没成功?大概率是只单独对id或dat用了%in%,但没有同时匹配两列的组合,而上面的两种方法都是直接基于多列组合做匹配,所以能精准得到你要的结果。
内容的提问来源于stack exchange,提问作者Frederick
相关产品推荐
相关产品推荐

