首页 文章

如果另一个数据框中存在组合,则R检查行的行[重复]

提问于
浏览
2

这个问题在这里已有答案:

我试着找出这个问题的答案但没有运气 . 我在R中有两个数据框(df1和df2),除了两列,一个人数字(pnr)和一个药物名称(名称)之外,有两个不同的信息 . 在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  |...|
....

例如,我想检查,如果行组合pnr = 1&drug = 1存在于df2(否),pnr = 1&drug = 2(是)等等,然后在其中放置“是”或“否”检查df1中的列

我没有运气就试过以下 for 声明 . 它确实放置了一个"yes or " no " in the " check“列,但它没有正确执行

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 ,但我无法弄明白 . 你们有没有想法,如何解决这个问题?`

真诚的再见

3 回答

  • 6

    一种方法是使用 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
    
  • 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))
    
  • 4

    这对于 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
    

相关问题