Duas maneiras de selecionar variável (s) de forma programática :
with = FALSE:
DT = data.table(col1 = 1:3)
colname = "col1"
DT[, colname, with = FALSE]
'ponto ponto' ( ..) prefixo:
DT[, ..colname]
Para obter uma descrição mais detalhada da ..notação 'ponto ponto' ( ), consulte Novos recursos em 1.10.2 (atualmente não está descrito no texto de ajuda).
Para atribuir a variável (s), coloque o LHS de :=entre parênteses:
DT[, (colname) := 4:6]
O último é conhecido como plonk de coluna , porque você substitui todo o vetor de coluna por referência. Se um subconjunto iestivesse presente, ele seria subatribuído por referência. Os parênteses ao redor (colname)são uma abreviação introduzida na versão v1.9.4 no CRAN de outubro de 2014. Aqui está o item de notícias :
Usar with = FALSEcom :=agora está obsoleto em todos os casos, uma vez que :=há algum tempo é preferível envolver o LHS de entre parênteses.
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 também a seção Detalhes em ?`:=`:
DT[i, (colnamevector) := value]
E para responder a outras perguntas no comentário, aqui está uma maneira (como de costume, há muitas maneiras):
DT[, colname := cumsum(get(colname)), with = FALSE]
ou, você pode achar mais fácil ler, escrever e depurar apenas em evalum paste, semelhante a construir uma instrução SQL dinâmica para enviar a um servidor:
expr = paste0("DT[,",colname,":=cumsum(",colname,")]")
expr
eval(parse(text=expr))
Se você faz muito isso, pode definir uma função auxiliar EVAL:
EVAL = function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))
EVAL("DT[,",colname,":=cumsum(",colname,")]")
Agora que data.table1.8.2 otimiza automaticamente jpara eficiência, pode ser preferível usar o evalmétodo. O get()in jimpede algumas otimizações, por exemplo.
Ou, existe set(). Uma baixa sobrecarga, forma funcional de :=, o que seria ótimo aqui. Veja ?set.
set(DT, j = colname, value = cumsum(DT[[colname]]))
DT