2016-09-15 1 views
3

J'ai une liste de vecteurs (caractères). Par exemple:R comment trouver l'intersection d'un sous-vecteur de vecteurs dans une liste

my_list <- list(c("a", "b", "c"), 
       c("a", "b", "c", "d"), 
       c("e", "d")) 

Pour l'intersection de ces trois vecteurs, je pourrais utiliser: Reduce(intersect, my_list). Mais comme vous pouvez le voir, il n'y a pas d'élément commun dans les trois vecteurs. Puis, et si je veux trouver l'élément commun qui apparaît "au moins" un certain nombre de fois dans la liste? Tels que: somefunction(my_list, time=2) me donnerait c("a", "b", "c", "d") parce que ces éléments apparaissent deux fois.

Merci.

Répondre

3

Nous pouvons convertir en un data.table et faire le groupe par action pour obtenir les éléments

library(data.table) 
setDT(stack(setNames(my_list, seq_along(my_list))))[, 
      if(uniqueN(ind)==2) values , values]$values 
#[1] "a" "b" "c" "d" 

Une option base R serait de unlist le « my_list », trouver compter la fréquence avec la réplication séquence de 'ma_liste' en utilisant table, obtenez la somme des colonnes, vérifiez si elle est égale à 2 et utilisez cet index pour sous-totaliser le .

tblCount <- colSums(table(rep(seq_along(my_list), lengths(my_list)), unlist(my_list))) 
names(tblCount)[tblCount==2] 
#[1] "a" "b" "c" "d" 
2

Si vous supposez que chaque élément n'apparaîtra pas plus d'une fois dans un vecteur, vous pouvez "annuler la liste" de vos vecteurs et compter la fréquence.

Ici, en utilisant les fonctions dplyr

library(dplyr) 
my_list %>% unlist %>% data_frame(v=.) %>% count(v) %>% filter(n>=2) %>% .[["v"]] 

ou des fonctions de base

subset(as.data.frame(table(unlist(my_list))), Freq>=2)$Var1