子集数据匹配另一个数据帧中的两个变量

时间:2014-11-26 05:50:15

标签: r

场合

我有两个数据框df1df2

id <- c(1, 2, 3, 4, 5, 6, 7, 8)
position <- c("AA", "BB", "CC", "DD", "EE", "FF", "GG", "HH")
value <- c(100, 200, 300, 400, 500, 600, 700, 800)
df1 <- data.frame(id, position, value)

id <- c(1, 2, 3, 4, 6, 8)
position <- c("AA", "BB", "CC", "EE", "DD", "HH")
value <- c(700, 800, 900, 100, 200, 900)
df2 <- data.frame(id, position, value)

问题

我想在df1中选择id中匹配positiondf2的所有行。

尝试

我很确定这很简单,但我很难找到合适的解决方案。

我可以使用merge执行此操作,但我希望避免删除列和硬编码变量名称。

#this method works for this small example but I have many variables and don't want
#to write them all out when removing the unwanted ones
df3 <- merge(x=df1, y=df2, by=c("id","position"))
df3 <- df3[,-4]    #remove unused column
df3

我以为我可以使用dplyr,比如

#library(dplyr)
df3 <- filter(df1, id %in% df2$id) 
df3

但我对两个变量的匹配并不多。

所需的输出

  id position value.x
1  1       AA     100
2  2       BB     200
3  3       CC     300
4  8       HH     800

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:3)

merge仍可以非常高效地使用,无需在合并后删除列。

keys <- c("id","position")
merge(df1,df2[keys],by=keys)

#  id position value
#1  1       AA   100
#2  2       BB   200
#3  3       CC   300
#4  8       HH   800

答案 1 :(得分:1)

您可以paste将两列合并在一起,match

    df1[match(paste(df2$id,df2$position),paste(df1$id,df1$position),nomatch=0),]
    #id position value
    #1  1       AA   100
    #2  2       BB   200
    #3  3       CC   300
    #8  8       HH   800