2016-09-15 1 views
3

Ich habe eine Liste von Vektoren (Zeichen). Zum Beispiel:R wie finde ich den Schnittpunkt einer Untermenge von Vektoren in einer Liste

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

Für die Kreuzung aller dieser drei Vektoren, konnte ich verwenden: Reduce(intersect, my_list). Aber wie Sie sehen können, gibt es in allen drei Vektoren kein gemeinsames Element.

Dann, was, wenn ich das gemeinsame Element finden möchte, das "mindestens" eine bestimmte Anzahl von Malen in der Liste erscheint? Wie zum Beispiel: somefunction(my_list, time=2) würde mir c("a", "b", "c", "d") geben, weil diese Elemente zweimal erscheinen.

Danke.

Antwort

3

Wir können diese konvertieren zu einem data.table und tun, um die Gruppe von Maßnahmen, um die Elemente zu erhalten

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

A base R Option unlist die ‚my_list‘ sein würde, finden die Häufigkeit, mit der replizierten zählen Sequenz von 'my_list' mit table, holen Sie die Spaltensummen, prüfen Sie, ob es gleich 2 ist und verwenden Sie diesen Index, um die names zu unterteilen.

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

Wenn Sie davon ausgehen, dass jedes Element nicht mehr als einmal in einem Vektor erscheint, können Sie „fehlende oder“ Ihre Vektoren und die Frequenz zählen. Hier

, mit dplyr Funktionen

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

oder Basisfunktionen

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