2016-04-29 88 views
0

我有2個數據集;一個包含關於患者的信息,另一個是醫療碼在R中找到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中的指示器列,它顯示了中的代碼是否出現在patient$codes中。

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 

所有解決方案完全匹配?

+0

你想要完全匹配嗎? –

+0

@Kunal Puri是 – Lb93

+1

您確定您的預期產出是正確的嗎?認爲你可以做'耐心$ mh < - 耐心$ code%在%code $代碼' – mtoto

回答

2

你可以這樣做:

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

更新:

正如Pasqui正確建議,爲獲得0和1,

可以進一步做:

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

然後'患者[,mh:= as.numeric(mh)]'因爲他想要0s和1s :) – Pasqui

1

編輯:別人發佈了更好的答案。我喜歡@moto自己的%1。更簡潔,更高效。堅持與那些:)

這應該做到這一點。我已經使用了一個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表示不匹配)回進入患者框架,作爲一個新的專欄。

這就是你所追求的?

相關問題