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 i
hubiera 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 = FALSE
con :=
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 eval
una 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.table
1.8.2 optimiza automáticamente la j
eficiencia, puede ser preferible utilizar el eval
método. El get()
in j
evita 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