2016-04-29 8 views
0

Ich habe 2 Datensätze; eine enthält Informationen über Patienten und die andere ist eine Liste von medizinischen CodesSuche nach übereinstimmenden Zeichenketten in 2 Datensätzen in R

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)) 

Die code$term Werte hat, aber für dieses Beispiel sind sie weggelassen.

Was ich will ist eine Anzeigesäule in patient, die 1 zeigt, wenn ein Code in code in patient$codes auftritt.

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 

war meine Lösung Grepl zu verwenden:

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

aber dies nicht als code funktionierte nicht die gleiche Länge ist, und ich habe die Warnung

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

Alle Lösungen für eine genaue Übereinstimmung?

+0

Wollen Sie genau übereinstimmen? –

+0

@Kunal Puri Ja – Lb93

+1

Sind Sie sicher, dass Ihre erwartete Ausgabe korrekt ist? Denke, du kannst einfach 'patient $ mh <- patient $ codes% in% code $ codes' machen – mtoto

Antwort

2

Sie können dies tun:

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

Update:

Wie zu Recht von Pasqui vorgeschlagen, für 0 und 1 erhalten,

können Sie weiter tun:

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

und dann' patient [, mh: = as.numeric (mh)] '' weil er 0s und 1s will :) – Pasqui

1

EDIT: andere haben bessere Antworten gepostet. Ich mag die% in% von @moto selbst. Viel prägnanter und viel effizienter. Stick mit denen :)

Dies sollte es tun. Ich habe eine for-Schleife verwendet, damit Sie etwas herausfinden können, das effizienter wäre. Ich habe die Schleife auch in ein paar Zeilen aufgespalten, anstatt sie in eine zu komprimieren. Das ist nur so können Sie sehen, was passiert:

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

Also das geht nur durch die Patientenliste eins nach dem anderen, prüft, ob ein Spiel Grepl verwenden, setzt dann das Ergebnis (1 Spiel, 0 für kein Spiel) zurück in den Patientenrahmen, als neue Spalte.

Sind Sie danach?