É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)strsplit
dummy
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
.
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