2014-12-16 9 views
6

Ich möchte die Schnittmenge aller Gruppen einer Datentabelle haben. Also für die angegebenen Daten:R data.table Kreuzung aller Gruppen

data.table(a=c(1,2,3, 2, 3,2), myGroup=c("x","x","x", "y", "z","z")) 

Ich möchte das Ergebnis haben:

2 

Ich weiß, dass

Reduce(intersect, list(c(1,2,3), c(2), c(3,2))) 

gibt mir das gewünschte Ergebnis, aber ich habe nicht herausfinden, wie man eine Liste von Gruppen einer data.table-Abfrage erzeugt.

Antwort

5

ich versuchen würde, Reduce in der folgenden Art und Weise unter Verwendung von (dt Annahme, daß Ihre Daten)

Reduce(intersect, dt[, .(list(unique(a))), myGroup]$V1) 
## [1] 2 
+1

Ich mag es. Es ist einfacher, einfacher zu verstehen und entspricht definitiv dem Ansatz des OP. –

2

Hier ist ein Ansatz.

nGroups <- length(unique(dt[,myGroup])) 
dt[, if(length(unique(myGroup))==nGroups) .BY else NULL, by="a"][[1]] 
# [1] 2 

Und hier ist es mit einigen erklärenden Kommentaren.

Wenn dieser Code und die Kommentare nicht eindeutig sind, kann ein kurzer Blick auf die folgenden Punkte hilfreich sein. Im Grunde sucht der obige Ansatz nur den Wert a für die Gruppen, die x,y,z in Spalte V1 zurückgeben, und meldet den Wert.

dt[,list(list(unique(myGroup))), by="a"] 
# a V1 
# 1: 1  x 
# 2: 2 x,y,z 
# 3: 3 x,z 
+0

Up-gestimmt, aber die Logik bleibt mir undurchsichtig. –

+0

@BondedDust - OK, einige Erklärungen hinzugefügt. –