Deux façons de sélectionner par programme des variables:
with = FALSE
:
DT = data.table(col1 = 1:3)
colname = "col1"
DT[, colname, with = FALSE]
..
Préfixe 'dot dot' ( ):
DT[, ..colname]
Pour une description plus détaillée de la ..
notation «point point» ( ), voir Nouvelles fonctionnalités de la 1.10.2 (elle n'est actuellement pas décrite dans le texte d'aide).
Pour attribuer une ou plusieurs variables, placez la LHS de :=
entre parenthèses:
DT[, (colname) := 4:6]
Ce dernier est connu sous le nom de plonk de colonne , car vous remplacez le vecteur de colonne entier par référence. Si un sous-ensemble i
était présent, il se sous-attribuerait par référence. Le parens autour (colname)
est un raccourci introduit dans la version v1.9.4 sur CRAN octobre 2014. Voici la nouvelle :
L'utilisation de with = FALSE
with :=
est désormais déconseillée dans tous les cas, étant donné que l'encapsulation de la LHS de :=
avec des parenthèses est préférée depuis un certain temps.
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 = ...]
Voir également la section Détails dans ?`:=`
:
DT[i, (colnamevector) := value]
Et pour répondre à une autre question en commentaire, voici une façon (comme d'habitude, il y a plusieurs façons):
DT[, colname := cumsum(get(colname)), with = FALSE]
ou, vous pourriez trouver plus facile de lire, d'écrire et de déboguer juste à eval
un paste
, similaire à la construction d'une instruction SQL dynamique à envoyer à un serveur:
expr = paste0("DT[,",colname,":=cumsum(",colname,")]")
expr
eval(parse(text=expr))
Si vous faites beaucoup cela, vous pouvez définir une fonction d'assistance EVAL
:
EVAL = function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))
EVAL("DT[,",colname,":=cumsum(",colname,")]")
Maintenant que la data.table
1.8.2 optimise automatiquement l' j
efficacité, il peut être préférable d'utiliser la eval
méthode. Le get()
in j
empêche certaines optimisations, par exemple.
Ou, il y en a set()
. Une forme fonctionnelle de faible frais généraux, :=
qui conviendrait ici. Voir ?set
.
set(DT, j = colname, value = cumsum(DT[[colname]]))
DT