Dos formas de seleccionar variable (s) mediante programación:
with = FALSE:
DT = data.table(col1 = 1:3)
colname = "col1"
DT[, colname, with = FALSE]
..prefijo 'dot dot' ( ):
DT[, ..colname]
Para obtener una descripción más detallada de la ..notación 'punto punto' ( ), consulte Nuevas funciones en 1.10.2 (actualmente no se describe en el texto de ayuda).
Para asignar a variable (s), coloque el LHS de :=entre paréntesis:
DT[, (colname) := 4:6]
Este último se conoce como plonk de columna , porque reemplaza el vector de columna completo por referencia. Si ihubiera un subconjunto , se subasignaría por referencia. El parens around (colname)es una taquigrafía introducida en la versión v1.9.4 en CRAN de octubre de 2014. Aquí está la noticia :
El uso de with = FALSEcon :=ahora está obsoleto en todos los casos, dado que :=durante algún tiempo se ha preferido envolver el LHS de entre paréntesis.
colVar = "col1"
DT[, (colVar) := 1]
DT[, c("col1", "col2") := 1]
DT[, 2:4 := 1]
DT[, c("col1","col2") := list(sum(a), mean(b))]
DT[, `:=`(...), by = ...]
Consulte también la sección Detalles en ?`:=`:
DT[i, (colnamevector) := value]
Y para responder más preguntas en el comentario, aquí hay una forma (como de costumbre, hay muchas formas):
DT[, colname := cumsum(get(colname)), with = FALSE]
o bien, puede que le resulte más fácil de leer, escribir y depurar sólo para evaluna paste, similar a la construcción de una sentencia de SQL dinámico para enviar a un servidor:
expr = paste0("DT[,",colname,":=cumsum(",colname,")]")
expr
eval(parse(text=expr))
Si lo hace mucho, puede definir una función auxiliar EVAL:
EVAL = function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))
EVAL("DT[,",colname,":=cumsum(",colname,")]")
Ahora que data.table1.8.2 optimiza automáticamente la jeficiencia, puede ser preferible utilizar el evalmétodo. El get()in jevita algunas optimizaciones, por ejemplo.
O lo hay set(). Una forma funcional de bajo costo, :=que estaría bien aquí. Ver ?set.
set(DT, j = colname, value = cumsum(DT[[colname]]))
DT