Data.table: [R-Forge # 5222] 'nicht gefunden', wenn DT [, Liste (Summe (nicht .SD-col), lapply (.SD, Mittelwert)), von = ..., .SDcols = ...]

Erstellt am 8. Juni 2014  ·  12Kommentare  ·  Quelle: Rdatatable/data.table

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.

High bug

Alle 12 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen