match()的子集友好版本

问题描述 投票:0回答:2

我不喜欢(或不理解)

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,其次是因为它只返回id
3
df1
中的第一次出现,但我希望所有匹配项都出现。

如何调整匹配功能,使其像上面描述的那样?

r match subset
2个回答
0
投票

这将给出预期的输出:

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

0
投票

您可以使用

%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

© www.soinside.com 2019 - 2024. All rights reserved.