2016-02-04 1 views
1

J'ai une table avec plusieurs chaînes différentes dans la même colonne. Je voudrais être en mesure de rechercher cette colonne et trouver des chaînes différentes, puis retourner des résultats différents pour chaque chaîne différente. Par exemple, si je la colonne suivante de données:Rechercher et renvoyer plusieurs chaînes indépendantes

Seq_ID Column2 
    1. RNA-ATI_1  
    2. RNA-ATI_2 
    3. DNA-FU_1 
    4. FU-DNA_2 
    5. DNA-TP1_1 
    6. RNA-TP1_2 
    7. RNA-BL_1 
    8. BL-RNA_2 

Je voudrais rechercher la chaîne « ATI » et retour « ATI » et recherche « FU » et retour « FU » et « TP1 » et retourner "TP1" pour que je puisse construire une nouvelle table avec les chaînes dans un column2 séparé. Je peux utiliser grepl pour faire cela pour une seule valeur, mais je n'arrive pas à comprendre comment le faire pour plusieurs sorties. Certaines des mises en garde sont que les données ne sont pas toujours dans le même ordre ou séparées par le même symbole.

y <- ifelse(grepl("*ATI", tab$Sequence_ID), "Analytical treatment interruption", " ") 

Cela semble fonctionner pour un seul, mais je ne peux pas comprendre comment l'étendre à travailler pour plusieurs.

En fin de compte, je voudrais:

Seq_ID  Column2 
    1. RNA-ATI_1 ATI 
    2. RNA-ATI_2 ATI 
    3.  DNA-FU_1  FU 
    4.  FU-DNA_2  FU 
    5. DNA-TP1_1 TP1 
    6. RNA-TP1_2 TP1 
    7.  RNA-BL_1  BL 
    8.  BL-RNA_2  BL 
+0

Ainsi, votre résultat attendu ne correspond pas tout à fait ce que vous essayez de faire? Dans votre 'grepl', vous essayez de remplacer' ATI' par 'interruption de traitement analytique'. Je ne vois pas cela dans votre sortie. Comment est-ce pertinent ici? Ou votre sortie attendue est-elle partielle et seulement un problème XY? –

Répondre

1

Vous pouvez utiliser stringr::str_extract_all

y <- stringr::string_extract_all(dat$Column2,"ATI|FU|TP1|BL") 
2

Vous pouvez spécifier plusieurs motifs à un appel regexpr, en supposant qu'ils sont toutes les chaînes distinctes. .: par exemple

regmatches(dat$Column2, regexpr("ATI|FU|TP1|BL", dat$Column2)) 
#[1] "ATI" "ATI" "FU" "FU" "TP1" "TP1" "BL" "BL" 

Cela aurait des analogies dans les stringistringr etc paquets trop en utilisant leurs str_extract et stri_extract fonctions - voir @mnel et sa réponse ci-dessus.