Eingereicht von: Matt Weller; Zugewiesen an: Niemand; R-Forge Link
Bei Verwendung von .SDcols
(zum Anwenden einer Funktion auf mehrere Spalten) kann ich mit der folgenden Syntax nicht auf andere Spalten in der Originaltabelle (v1) verweisen:
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp, :
# object 'v1' not found
Ein ähnlicher Fehler tritt auf, wenn ich c anstelle von list verwende. Es ist klar, dass auf die Spalte v1 innerhalb der j
-Klausel nicht zugegriffen werden kann.
Ich habe auf den folgenden Code zurückgegriffen, der Spalte v1 enthält, obwohl ich nicht möchte, dass dieser in den Teil lapply
wird, und ihn nach der Berechnung löschen muss.
sd.cols = c("v1","v2", "v3")
dt.out = dt[, c(sum.v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]
Laut eddi auf Stackoverflow ist dies ein Fehler und er hat mich gebeten, ihn zu melden. Ich kann nicht viel detaillierter angeben, da ich nicht genau sicher bin, welcher Teil seiner Meinung nach ein Fehler war. Wenn ich mir die akzeptierte Antwort von Arun und die anschließende Diskussion ansehe, wird deutlich, wo, aber das Problem liegt.
Hier ist der relevante SO-Beitrag.
Ein weiterer Beitrag zum Aktualisieren: http://stackoverflow.com/questions/27755518/data-table-sd-lapply-multiple-columns-in-argument
Etwas spät, aber diese Frage von mir auf den Stapel legen
Ich habe es nicht einmal als Fehler angesehen, normalerweise stelle ich zusätzliche erforderliche Felder für .SDcols
bereit und später in j
ich .SD[, !"total", with=FALSE]
, um unerwünschte Spalten auszuschließen.
Das ist eine weitere gute Problemumgehung. Ich frage mich, welchen Leistungsunterschied es bei der Verwendung von dt$total
. Und ja, diese Art tanzt die Grenze zwischen FR und Bug, IMO.
Ich stoße das wieder auf. Sieht so aus, als könnte dies eine sehr wichtige Lösung sein. Diese Frage scheint mit DT[, (deltaColsNewNames) := lapply(.SD, normalDelta, price), .SDcols = deltaColsNames]
verbunden zu sein und könnte möglicherweise über
Hier ist ein weiterer einfacher Fall, in dem dies nützlich wäre: http://stackoverflow.com/a/32498711/1191259
Hier ist ein weiterer einfacher Fall, der darunter leidet:
Ein weiteres Update, wenn es behoben ist: http://stackoverflow.com/q/32915770/1191259
Yay! wir können jetzt das tun:
require(data.table)
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# grp v1 v2 v3
# 1: 2 7 4.5 12.5
# 2: 3 12 4.0 13.0
# 3: 1 9 3.5 13.5
Alle hier verlinkten SO-Beiträge wurden aktualisiert. Dank an alle.
Danke, @arunsrinivasan. Ich habe ein paar Jahre auf dieses Update gewartet.
Genial! Vielen Dank