Zwei Möglichkeiten zur programmgesteuerten Auswahl von Variablen:
with = FALSE::
DT = data.table(col1 = 1:3)
colname = "col1"
DT[, colname, with = FALSE]
# col1
# 1: 1
# 2: 2
# 3: 3
..Präfix 'dot dot' ( ):
DT[, ..colname]
# col1
# 1: 1
# 2: 2
# 3: 3
Weitere Informationen zur.. Notation 'dot dot' ( ) finden Sie unter Neue Funktionen in 1.10.2 (derzeit nicht im Hilfetext beschrieben).
Um Variablen zuzuweisen , setzen Sie die LHS von :=in Klammern:
DT[, (colname) := 4:6]
# col1
# 1: 4
# 2: 5
# 3: 6
Letzteres wird als Spalten- Plonk bezeichnet , da Sie den gesamten Spaltenvektor durch Referenz ersetzen. Wenn eine Teilmenge ivorhanden wäre, würde sie durch Referenz untergeordnet. Die Parens (colname)sind eine Abkürzung, die in Version v1.9.4 auf CRAN Oct 2014 eingeführt wurde. Hier ist die Nachricht :
Die Verwendung with = FALSEmit :=ist jetzt in allen Fällen veraltet, da das Umschließen der LHS :=mit Klammern seit einiger Zeit bevorzugt wird.
colVar = "col1"
DT[, colVar := 1, with = FALSE] # deprecated, still works silently
DT[, (colVar) := 1] # please change to this
DT[, c("col1", "col2") := 1] # no change
DT[, 2:4 := 1] # no change
DT[, c("col1","col2") := list(sum(a), mean(b)] # no change
DT[, `:=`(...), by = ...] # no change
Siehe auch Abschnitt Details in ?`:=`:
DT[i, (colnamevector) := value]
# [...] The parens are enough to stop the LHS being a symbol
Und um weitere Fragen im Kommentar zu beantworten, gibt es eine Möglichkeit (wie üblich gibt es viele Möglichkeiten):
DT[, colname := cumsum(get(colname)), with = FALSE]
# col1
# 1: 4
# 2: 9
# 3: 15
oder es ist möglicherweise einfacher, nur evaleine zu lesen, zu schreiben und zu debuggen paste, ähnlich wie beim Erstellen einer dynamischen SQL-Anweisung, die an einen Server gesendet werden soll:
expr = paste0("DT[,",colname,":=cumsum(",colname,")]")
expr
# [1] "DT[,col1:=cumsum(col1)]"
eval(parse(text=expr))
# col1
# 1: 4
# 2: 13
# 3: 28
Wenn Sie das häufig tun, können Sie eine Hilfsfunktion definieren EVAL:
EVAL = function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))
EVAL("DT[,",colname,":=cumsum(",colname,")]")
# col1
# 1: 4
# 2: 17
# 3: 45
Nun , da data.table1.8.2 automatisch optimiert jfür Effizienz, kann es vorteilhaft sein , die verwenden evalMethode. Das get()In jverhindert beispielsweise einige Optimierungen.
Oder gibt es set(). Eine funktionale Form mit geringem Overhead, :=die hier in Ordnung wäre. Siehe ?set.
set(DT, j = colname, value = cumsum(DT[[colname]]))
DT
# col1
# 1: 4
# 2: 21
# 3: 66