我不喜欢(或不理解)
match()
函数,因为如果它没有找到值,它会输出 NA
并且因为它只返回匹配项的第一次出现。两者都不利于将一个数据帧子集化为另一个数据帧,至少在我的情况下是这样。
让数据成为
df1 <- data.frame(id=c(1:3,3:4), val= 11:15)
df2 <- data.frame(id= c(2,0,3,1), val=91:94)
我想通过
df1
的 id 对 df2
进行子集化。所以我想要的输出是
df_expected <- data.frame(id= c(2,3,3,1), val= c(12,13,14,11))
但是如果我尝试使用
df1
对 df1[match(df2$id, df1$id), ]
进行子集化,我得到的不是我所期望的,首先是因为 match
返回一个 NA
因为它在 0
中找不到 id df1
它添加了一行包含只是NA
s,其次是因为它只返回id3
在df1
中的第一次出现,但我希望所有匹配项都出现。
如何调整匹配功能,使其像上面描述的那样?
这将给出预期的输出:
library(dplyr)
df1 %>%
filter(id %in% df2$id) %>%
arrange(match(id, df2$id))
id val
1 2 12
2 3 13
3 3 14
4 1 11
您可以使用
%in%
和which
的组合。但是,输出不是您发布的顺序。
df1 <- data.frame(id=c(1:3,3:4), val= 11:15)
df2 <- data.frame(id= c(2,0,3,1), val=91:94)
i <- which(df1$id %in% df2$id)
df1[i, ]
#> id val
#> 1 1 11
#> 2 2 12
#> 3 3 13
#> 4 3 14
创建于 2023-04-22 与 reprex v2.0.2