检查行与行之间是否在另一个数据框中存在组合

6

我在R中有两个数据框(df1和df2),它们包含不同的信息,除了两列:一个人员编号(pnr)和一个药品名称(name)。在df1中,逐行检查pnr和name的组合是否存在于df2中。如果存在,则在df1中的另一列中写入“是”。如果不存在,则写入“否”。

df1
pnr|drug|...|check
---|----|---|-----
1  | 1  |...| no
1  | 2  |...| yes
2  | 2  |...| yes
3  | 2  |...| no
.....

df2
pnr|drug|...|
---|----|---|
1  | 2  |...|
2  | 2  |...|
....

例如,我想检查在df2中是否存在行组合pnr=1 & drug=1(否),pnr=1 & drug=2(是)等。然后在df1中的check列中放置一个"yes"或"no"。
我尝试了以下代码,但没有成功。它确实在"check"列中放置了"yes"或"no",但并不正确。
for(index in 1:nrow(df1)){
   if((df1[index,]$pnr %in% df2$pnr)&(df1[index,]$name %in% df2$name)){
   check_text="yes"}else{check_text="no"}
   df1$check=check_text
}

我感觉应该使用apply,但是一直没有找到解决方法。你们有没有什么办法解决这个问题?


1
@zx8754 我不感兴趣合并数据帧。 - reuss
@ 预期输出在我的df1图表中。Ronak Shah下面的答案解决了问题。 - reuss
3个回答

11

一种方法是使用 base R 方法。

将列 pnrdrug 进行拼接,然后在 df1 中找到相似的 match

df1$check <- ifelse(is.na(match(paste0(df1$pnr, df1$drug), 
                                        paste0(df2$pnr, df2$drug))),"No", "Yes")

#  pnr drug check
#1   1    1    No
#2   1    2   Yes
#3   2    2   Yes
#4   3    2    No

到目前为止,最快的方法就是不必计算整个合并(又称为连接)。 - nigelhenry

8

对于 dplyr::left_join,这是很自然的:

library(dplyr) # for left_join, transmute
library(tidyr) # for replace_na

df1 <- expand.grid(pnr = 1:3, drug = 1:3)
df2 <- data.frame(pnr = c(1, 3), drug = c(2, 1))

df1 <- df1 %>%
  left_join(df2 %>% transmute(pnr, drug, check = 'yes')) %>%
  replace_na(list(check = 'no'))

df1

#>   pnr drug check
#> 1   1    1    no
#> 2   2    1    no
#> 3   3    1   yes
#> 4   1    2   yes
#> 5   2    2    no
#> 6   3    2    no
#> 7   1    3    no
#> 8   2    3    no
#> 9   3    3    no

4
我们可以使用apply函数,并使用any函数检查匹配:
df1$check <- 
    apply(df1, 1, function(x) 
    ifelse(any(x[1] == df2$pnr & x[2] == df2$drug), 'yes','no'))

# df1

#    pnr drug check
# 1   1    1    no
# 2   1    2   yes
# 3   2    2   yes
# 4   3    2    no

数据

df1 <- data.frame(pnr = c(1,1,2,3),
                  drug = c(1,2,2,2))

df2 <- data.frame(pnr = c(1,2),
                  drug = c(2,2))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接