2016-03-11 1 views
0

Suite d'un problème plus tôt: R - return boolean if any strings in a vector appear in any of several columnsR - Comptez le nombre de fois des chaînes similaires apparaissent dans plusieurs colonnes

Je ne pensais pas que je devais compter le nombre de chaînes similaires de mon vecteur qui apparaissent dans mon trame de données , mais il s'avère que c'est une information utile. D'oh!

Le problème: J'ai une grande trame de données dont les colonnes 5 à 24 sont des codes de diagnostic. Chaque rangée est une admission individuelle à l'hôpital. Le code risk_codes contient des codes de diagnostic tronqués. J'ai cherché une nouvelle colonne à la trame de données qui m'a indiqué si des codes de risque sont apparus dans les 20 codes de diagnostic. Le hic était que j'avais besoin d'un match partiel, pas de match complet.

Col1 Col2 Col3 Col4 Diag_1 Diag_2 Diag_3 ... Diag_20 
data data data data J123 F456 H789  E468 
data data data data T452 NA  NA   NA 

Le code pour le faire:

df$newcol <- apply(df,1,function(x) any(sapply(risk_codes, function(codes) grepl(codes,x[c(5:24)])))) 
df$newcol <- ifelse(df$newcol,1,0) 

Ce retourne avec succès 1 à la nouvelle colonne si des risk_codes correspondent aux codes de diagnostic de l'admission.

risk_codes <- c("J1","F45","H987") 

Col1 Col2 Col3 Col4 Diag_1 Diag_2 Diag_3 ... Diag_20 newcol 
data data data data J123 F456 H789  E468  1 
data data data data T452 NA  NA   NA  0 

La complication supplémentaire: Maintenant, je voudrais compter le nombre de matches, plutôt que de voir juste qu'il ya des allumettes. C'est probablement une manipulation de la première ligne de code présentée mais j'ai du mal à trouver la logique.

risk_codes <- c("J1","F45","H987") 

Col1 Col2 Col3 Col4 Diag_1 Diag_2 Diag_3 ... Diag_20 newcol count 
data data data data J123 F456 H789  E468  1  2 
data data data data T452 NA  NA   NA  0  0 
+0

Vous devez inclure un [exemple reproductible]() dans votre question avec l'entrée de l'échantillon et souhaité sortie pour cette entrée. Il est étrange que vous énumériez une «solution» dans votre propre question. Peut-être que vous pouvez préciser que ce n'est pas vraiment ce que vous recherchez. – MrFlick

+0

Bon point, désolé. – tfmunkey

+0

Je pense que vous voulez dire que les colonnes 5-24 sont des codes dx. Sinon, le code ne pourrait pas fournir des résultats utiles. –

Répondre

1

En supposant que vous faites référence à des colonnes plutôt que des lignes, cela devrait réussir:

df$code_count <- apply(df,1,function(x) 
         sum(sapply(risk_codes, function(codes) grepl(codes,x[c(5:24)])))) 
+0

Mon Dieu! Merci, même si je suis un peu frustré de ne pas l'avoir remarqué moi-même. – tfmunkey