2017-07-05 1 views
-1

Veuillez vous référer au tableau suivant. J'ai besoin de vérifier si la famille inclut des chaînes dans la colonne de Appln_ID.R comment vectoriel partiel avec d'autres vecteurs de longueur n

je prévois d'utiliser

df$Match[grepl(paste(df$Appln_ID,collapse = "|"),df$Family)]<-"1" 

mais il ne fonctionne pas et les rapports "expression régulière invalide CN02822097.8 | CN200810105442.7 | CN200680019886.8 | C"

...

Si je produis

set<-c(Appln_ID[1], Appln_ID[2]....Appln_ID[3000]) 

ça marche ... Je ne sais pas pourquoi ...

enter image description here

+0

Vous voulez vérifier si 'Appln_ID' est dans * toutes * les entrées de' Family'? Ou par ligne appariée, c'est-à-dire 'Appln_ID [1]' dans 'Family [1]'? – CPak

Répondre

0

ÉDITÉ pour des éclaircissements OP

J'ai fait une trame de données faux du même format:

set.seed(1) 
df <- data.frame(Appln_ID = letters[1:5], 
       Family = sapply(1:5, function(x) paste0(letters[round(runif(runif(1)*10)*26)],collapse=";"))) 

Voici à quoi il ressemble:

Appln_ID   Family 
1  a    j;o 
2  b e;w;y;q;p;b;e;e;r 
3  c    t;m;s 
4  d j;t;x;f;q;c;g;j 
5  e    w;i;m 

Pour rechercher les lignes de Family se trouve dans tous les éléments de Appln_ID, j'utilise tidyverse et iterators:

install.packages("tidyverse") 
install.packages("iterators") 
library(tidyverse) 
library(iterators) 

search.all <- df %>% 
       mutate(dummy = Family) %>% 
       nest(dummy) %>% 
       rowwise() %>% 
       mutate(data = map(data, ~ unlist(strsplit(as.character(Family),";")))) %>% 
       ungroup() %>% 
       mutate(data = map(data, ~ (sum(sapply(iter(.x), function(y) y %in% Appln_ID) > 0)))) %>% 
       unnest() %>% 
       filter(data == 1) %>% 
       select(-data) 

L'idée est de 1) copie Family comme une colonne séparée (dummy), 2)strsplitdummy et sauf une liste imbriquée, 3) déterminez si un élément de est dans Appln_ID et enregistrez en tant que logique, 4) lignes de filtrage où conditionnel est TRUE.

La sortie:

Appln_ID Family 
1  a m;e;v;q;u 
2  d u;a;l;s;r 
3  e v;k;f;b 

Vous avez oublié que e contient également un b.

+0

Merci beaucoup! Je pense que la question est de rechercher tous "Appln_ID" dans toute la famille, en fonction de votre cas, le résultat attendu devrait être Famille Appln_ID 2 être; w; y; q; p; b; e; e; r (inclure b et e) 4 dj; t; x; f; q; c; g; j (include c) – xia

+0

Bon, alors vous voulez 'Family' où une entrée est dans' Appln_ID'? – CPak