如何根据另一个数据帧中的匹配值对数据帧进行子集化

时间:2014-12-08 15:56:04

标签: r dataframe subset

我正在尝试删除一个数据帧(df1)中的行,其中三列中的值与另一个由相同三列(df2)组成的数据帧中的值匹配。例如:

df1=data.frame(id=c(1552, 1552, 2501, 2504, 2504, 2504), month=c(4, 6, 7, 3, 4, 4), year=c(1970, 1970, 1971, 1971, 1971, 1972), weight=c(135, 654, 164, 83, 155, 195), sex=c('F', 'F', 'M', 'F', 'F', 'F'))

df2= data.frame (id=c(1552, 2504), month=c(6, 4), year=c(1970, 1971))

最后我想这样:

id month year weight sex
1 1552     4 1970    135   F
2 2501     7 1971    164   M
3 2504     3 1971     83   F
4 2504     4 1972    195   F

这个问题似乎很相似:Subset a data frame based on another 但我无法在我的问题中成功实施建议的解决方案。有谁知道怎么做?

1 个答案:

答案 0 :(得分:3)

我认为dplyr::anti_join在这里会有所帮助

library(dplyr)
df1 <- data.frame(id = c(1552, 1552, 2501, 2504, 2504, 2504),
                  month = c(4, 6, 7, 3, 4, 4),
                  year = c(1970, 1970, 1971, 1971, 1971, 1972),
                  weight = c(135, 654, 164, 83, 155, 195),
                  sex = c('F', 'F', 'M', 'F', 'F', 'F'))
df2 <- data.frame(id = c(1552, 2504), month = c(6, 4), year = c(1970, 1971))
df1 %>% anti_join(df2)
## Joining by: c("id", "month", "year")
##     id month year weight sex
## 1 2504     4 1972    195   F
## 2 2504     3 1971     83   F
## 3 2501     7 1971    164   M
## 4 1552     4 1970    135   F