场合
我有两个数据框df1
和df2
:
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
中匹配position
和df2
的所有行。
尝试
我很确定这很简单,但我很难找到合适的解决方案。
我可以使用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
任何帮助表示感谢。
答案 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