在R中的2组数据中查找匹配的字符串

时间:2016-04-29 09:58:07

标签: r grepl

我有2个数据集;一个包含患者信息,另一个包含医疗代码列表

patient <- data.table(ID = rep(1:5, each = 3),
                  codes = c("13H42", "1B1U", "Eu410", "Je450", "Fg65", "Eu411", "Eu402", "B110", "Eu410", "Eu50",
                           "1B1U", "Eu513", "Eu531", "Eu411", "Eu608")
                                        )
code <- data.table(codes = c("BG689", "13H42", "BG689", "Ju34K", "Eu402", "Eu410", "Eu50", "JE541", "1B1U", 
                        "Eu411", "Fg605", "GT6TU"), 
               term = c(NA))

code$term包含值,但在此示例中,它们被省略。

我想要的是patient中的指标列,如果code中的patient$codes中的代码出现,则会显示1。

 patient
    ID codes    mh
 1:  1 13H42  TRUE
 2:  1  1B1U  TRUE
 3:  1 Eu410  TRUE
 4:  2 Je450 FALSE
 5:  2  Fg65 FALSE
 6:  2 Eu411  TRUE
 7:  3 Eu402  TRUE
 8:  3  B110 FALSE
 9:  3 Eu410  TRUE
10:  4  Eu50  TRUE
11:  4  1B1U  TRUE
12:  4 Eu513 FALSE
13:  5 Eu531 FALSE
14:  5 Eu411  TRUE
15:  5 Eu608 FALSE

我的解决方案是使用grepl:

patient$mh <- mapply(grepl, pattern=code$codes, x=patient$codes)

然而,由于code长度不同而且我收到了警告,因此无法正常工作

Warning message:
In mapply(grepl, pattern = code$codes, x = patient$codes) :
  longer argument not a multiple of length of shorter

任何完全匹配的解决方案?

2 个答案:

答案 0 :(得分:2)

你可以这样做:

patient[,mh := codes %in% code$codes]

<强>更新

正如Pasqui正确建议的那样,获得0和1,

你还可以做:

patient[,mh := as.numeric(mh)]

答案 1 :(得分:1)

编辑:其他人发布了更好的答案。我喜欢@moto自己的%in%。更简洁,更有效率。坚持那些:))

这应该这样做。我已经使用了for循环,所以你可能会想出更高效的东西。我还将循环分成几行,而不是将其压缩成一行。这就是你可以看到发生了什么:

for( row in 1:nrow(patient) ) {
    codecheck <- patient$codes[row]
    output <- ifelse( sum( grepl( codecheck, code$codes ) ) > 0L, 1, 0 )
    patient$new[row] <- output
}

因此,这只是逐个浏览患者列表,使用grepl检查匹配,然后将结果(1表示匹配,0表示不匹配)返回患者帧,作为新列。

这就是你要追求的吗?