Was ist der beste Weg, um mehrere Spalten mit zuzuweisen data.table
? Beispielsweise:
f <- function(x) {c("hi", "hello")}
x <- data.table(id = 1:10)
Ich würde gerne so etwas machen (natürlich ist diese Syntax falsch):
x[ , (col1, col2) := f(), by = "id"]
Und um das zu erweitern, habe ich möglicherweise viele Spalten mit Namen, die in einer Variablen gespeichert sind (z. B. col_names
), und ich möchte Folgendes tun:
x[ , col_names := another_f(), by = "id", with = FALSE]
Was ist der richtige Weg, um so etwas zu tun?
by
@Christoph_J zu funktionieren . Link zu Ihrer Frage hinzugefügt zu FR # 2120 "Drop muss mit = FALSE für LHS von: =", damit es nicht vergessen wird, erneut zu besuchen.f()
gibt eine Funktion mehrere Werte zurück, einen für jede Ihrer Spalten.Antworten:
Dies funktioniert jetzt in Version 1.8.3 unter R-Forge. Vielen Dank für die Hervorhebung!
Ältere Version mit dem
with
Argument (wir raten von diesem Argument ab, wenn möglich):quelle
data.table(objectName=ls())[,c("rows","cols"):=dim(get(objectName)),by=objectName]
(Ich benutzedata.table
1.8.11)dim
gibt einen Vektor zurück, sodass die Konvertierung in einen Typ diesenlist
drehen sollte. zB[,c("rows","cols"):=as.list(dim(get(objectName))),by=objectName]
. Das Problem ist, dassas.list
der Anrufaufwand hoch ist und auch der kleine Vektor kopiert wird. Wenn Effizienz ein Problem ist, wenn die Anzahl der Gruppen steigt, lassen Sie es uns bitte wissen.x[,mynames:=list(mean(b)*4,sum(b)*3),by=a,with=FALSE][]
) gibt jetzt eine Warnung aus. Entfernen Sie sie also möglicherweise? Hat jemand inoptions(datatable.WhenJisSymbolThenCallingScope=TRUE)
einem ähnlichen Zusammenhang vorgeschlagen, dass eine Aufgabe wie diesex[,mynames:=list(mean(b)*4,sum(b)*3),by=a]
tatsächlich funktionieren sollte? Scheint so, als würde dies mit den anderen Änderungen übereinstimmen, obwohl ich denke, dass es zu viel vorhandenen Benutzercode (?) Brechen könnte.by=a
es wird funktionieren, aber eine andere Antwort zurückgeben. Diemean(a)
undsum(a)
Aggregate werden innerhalb jeder Gruppe recycelt, wennby=a
. Ohneby=a
es klebt einfach dasmean
undsum
für die gesamte Spalte in jede Zelle (dh unterschiedliche Zahlen).Die folgende Kurzschreibweise kann hilfreich sein. Alle Ehre gebührt Andrew Brooks, insbesondere diesem Artikel .
quelle