2014-05-07 8 views
5

Ich habe eine ähnliche Frage an: R: data.table : searching on multiple columns AND setting data type, aber diese Frage wurde nicht vollständig beantwortet. Ich habe eine paarweise Tabelle, die konzeptionell wie die folgende aussieht. Die Tabelle ist das Ergebnis der Umwandlung einer Matrix mit sehr großer Entfernung in eine Datentabelle (> 100.000.000 Zeilen), so dass der Vergleich a, b der gleiche wie b, a ist. A und b können jedoch in Spalte V1 oder V2 erscheinen. Ich möchte einfache Auswertungsstatistiken mit dem Abfragestil von data.table berechnen, aber ich habe noch nicht ganz herausgefunden, wie man Schlüssel in jeder Spalte auswählt. Ist das möglich?R Data.table für die Berechnung von zusammenfassenden Statistiken über mehrere Spalten hinweg

Ich habe versucht, Tasten in beide Richtungen, aber das gibt nur die Daten für diese Spalte. Ich habe auch versucht, mit list(), aber das bringt die Kreuzung (verständlicherweise) zurück, ich hoffte auf ein by = key1 | key2, aber kein solches Glück.


> set.seed(123) 
> 
> #create pairwise data 
> a<-data.table(t(combn(3,2))) 
> #create column that is equal both ways, 1*2 == 2*1 
> dat<-a[,data:=V1*V2] 
> dat 
    V1 V2 data 
1: 1 2 2 
2: 1 3 3 
3: 2 3 6 
#The id ==2 is the problem here, the mean should be 4 ((2+6)/2) 

> #set keys 
> setkey(dat,V1,V2) 
> 
> #One way data 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V1] 
> dat 
    V1 V2 data MEAN VAR 
1: 1 2 2 2.5 0.5 
2: 1 3 3 2.5 0.5 
3: 2 3 6 6.0 NA 

> #The other way 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V2] 
> dat 
    V1 V2 data MEAN VAR 
1: 1 2 2 2.0 NA 
2: 1 3 3 4.5 4.5 
3: 2 3 6 4.5 4.5 
> 
> #The intersect just produces the original data 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=list(V1,V2)] 
> dat 
    V1 V2 data MEAN VAR 
1: 1 2 2 2 NA 
2: 1 3 3 3 NA 
3: 2 3 6 6 NA 
> 
> #Meaningless but hopefull attempt. 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V1|V2] 
> dat 
    V1 V2 data  MEAN  VAR 
1: 1 2 2 3.666667 4.333333 
2: 1 3 3 3.666667 4.333333 
3: 2 3 6 3.666667 4.333333 
#The goal is to create a table would look like this (using mean as an example) 
ID MEAN 
1 2.5 
2 4.0 
3 4.5 

Meine Standard Ideen wäre zu Schleife durch eine dat sein [V1 == x | V2 == x] Aussage, aber ich glaube nicht, ich bin die volle Leistung des data.table Nutzbarmachung um eine einzelne Spalte von IDs mit Mittelwert der var als zusammenfassende Spalten zurückzugeben.

Vielen Dank!

+1

, was genau Ihre erwartete ist Ergebnis hier? – eddi

+0

bearbeitet, um das hoffnungsvolle Ergebnis widerzuspiegeln, das eine einzelne Spalte von IDs mit dem Mittelwert und var für diese ID ist. Danke, dass du zur Klärung beigetragen hast. – bw4sz

Antwort

4

Es wird am einfachsten Ihre Daten ein wenig neu zu ordnen zu erreichen, was Sie wollen (ich unten nicht das Recycling von data mit c(data, data) im ersten Teil zu geben):

dat[, list(c(V1, V2), data)][, list(MEAN = mean(data)), by = V1] 
# V1 MEAN 
#1: 1 2.5 
#2: 2 4.0 
#3: 3 4.5 
Verwandte Themen