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 i
estivesse 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 = FALSE
com :=
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 eval
um 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.table
1.8.2 otimiza automaticamente j
para eficiência, pode ser preferível usar o eval
método. O get()
in j
impede 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