2016-06-10 9 views
2

Ich habe folgende Datentabelle:einschließen Spalten für die Berechnung nicht in data.table Ergebnis verwendet

id user V1 V2 V3 V4 
1: 1 1 1 1 1 0 
2: 1 2 4 1 3 1 
3: 1 3 0 1 6 0 
4: 2 1 1 0 2 1 
5: 2 2 2 1 0 0 

und I führt eine lapply Gruppe von ID-Berechnung:

my_data[,lapply(.SD,mean)*.SD,by=id,.SDcols=3:5] 

Das Ergebnis ist die folgende :

id V1 V2  V3 
1: 1 1.666667 1.0 3.333333 
2: 1 6.666667 1.0 10.000000 
3: 1 0.000000 1.0 20.000000 
4: 2 1.500000 0.0 2.000000 
5: 2 3.000000 0.5 0.000000 

gibt es eine einfache Datentabelle Art und Weise die Spalte Benutzer enthalten aus der ursprünglichen Datentabelle? Ich habe es geschafft, es zu tun mit

cbind(my_data[,.(user)], my_data[,lapply(.SD,mean)*.SD,by=id,.SDcols=3:5]) 

aber ich hoffe wirklich, es ist ein schöner Weg

Antwort

3

Wir die Zuordnung von .SD

my_data[,(3:5) := lapply(.SD,mean)*.SD,by=id,.SDcols=3:5] 

Oder statt der Multiplikation tun, was wir tun es innerhalb der Schleife selbst.

my_data[, (3:5) := lapply(.SD, function(x) mean(x)*x), .SDcols = 3:5, by = id] 
+1

das funktioniert danke! Aber ich hätte gerne die Option 1 Den ursprünglichen Datensatz nicht zu ändern und 2 nur einige Spalten hinzuzufügen und nicht alle –

+1

@ George91 Da Sie nach einer effizienten Methode suchen, können Sie möglicherweise eine Kopie der Daten erstellen zB 'my_data1 <- my_data' und dann die Änderungen in den' my_data'. Die Zuweisung (': =') wäre schnell im Vergleich zu 'cbind' usw. – akrun

3

Ich schlage vor, Sie gehen durch die vignettes. Die Einführung in data.table Vignette einen wichtigen Punkt erklärt, die ich hier wiederholen würde ..

Solange j gibt eine Liste, jedes Element der Liste wird zu einer Spalte in dem resultierenden data.table.

In der Basis R gibt c(list, list) eine neue Liste mit allen Elementen zurück. Wir können einfach, dass die vorhandene Funktionalität zu tun verwenden:

require(data.table) # v1.9.7 devel 
dt[, c(list(user=user), lapply(.SD, function(x) x*mean(x))), by=id, .SDcols=V1:V4] 

ich auf dem current development version of data.table, v1.9.7 bin, die bestimmte neue Funktionen, beispielsweise Verwendung von V1:V4 in .SDcols:

+0

Also von was ich verstehe, wird dies von v1.9.7 funktionieren? Weil ich versucht habe, my_data [, c (list (user = user), lapply (.SD, function (x) x * mean (x))), by = id, .SDcols = 3: 6] und bekomme einen Fehler " Objektbenutzer nicht gefunden ". Entschuldigung, wenn ich missverstanden habe –

+1

Ja, du hast Recht. Wenn '.SDcols' bereitgestellt wird, war es zuvor nicht möglich, andere Variablen bereitzustellen. Dies wurde kürzlich in Version 1.9.7 behoben. Es wird CRAN als v1.9.8 (odd = devel, even = stable) bald treffen. Aber es sollte in Ordnung sein, mit devel zu arbeiten. Siehe Homepage für Installationsanweisungen. – Arun