2017-04-17 2 views
2

Wenn ich die folgende einfache Datentabelle haben:Anzahl der Reihen von .SD

DT <- data.table(VAL = sample(c(1, 2, 3), 10, replace = TRUE),Group = c(rep("A",5),rep("B",5))) 

ich den Mittelwert über calc kann:

DT[,lapply(.SD,function(x){mean(x)}),by=Group] 

konnte ich auch verwenden:

DT[,lapply(.SD,function(x){sum(x)/.N}),by=Group] 

Aber meine Frage ist, warum das folgende NICHT funktioniert:

DT[,lapply(.SD,function(x){sum(x)/nrow(x)}),by=Group] 

Aus meiner Sicht, .SD ist eine Unter-Datentabelle der vollständigen Datentabelle, also via Funktion (x) sollte ich in der Lage sein, auf die Anzahl der Zeilen von x beziehen - oder mit anderen Worten, warum kann ich Summe berechnen x), aber nicht now (x) in .SD? Habe diesbezüglich nichts in der Dokumentation gefunden.

+2

innen 'Funktion (x) {sum (x)/nRow (x)}', 'X' ist ein Vektor und seine '' dim' ist NULL' so dass es keine Zeilen gibt. – mt1022

Antwort

4

.SD ist ein data.table, aber wenn man lapply darüber, jeder x Wert ist ein Spaltenvektor, für die nrow nicht funktioniert. Wenn Sie stattdessen length tun, wird die Anzahl der Zeilen zurückgegeben.

DT[,lapply(.SD,function(x){sum(x)/length(x)}),by=Group] 
# Group VAL 
# 1:  A 2.0 
# 2:  B 1.6 
+1

Es gibt auch NROW für Leute, die Vektoren gerne als Tabellen behandeln. – Frank

+1

Aus der Beschreibung von OP geht nicht hervor, warum Sie 'sum (x) /. N' oder auch nur' mean (x) 'nicht verwenden würden. – MichaelChirico

Verwandte Themen