Sous-ensemble de données.tableau par colonne logique

J'ai un data.table avec une colonne logique. Pourquoi le nom de la colonne logique ne peut-il pas être utilisé directement pour l'argument i? Voir l'exemple.

dt <- data.table(x = c(T, T, F, T), y = 1:4)

# Works
dt[dt$x]
dt[!dt$x]

# Works
dt[x == T]
dt[x == F]

# Does not work
dt[x]
dt[!x]
27
demandé sur tk421 2013-04-24 15:41:32

3 réponses

À Partir de ?data.table

Avancé: lorsque i est un nom de variable unique, il n'est pas considéré comme expression des noms de colonnes et est plutôt évaluée dans la portée d'appel.

, Donc dt[x] va essayer d'évaluer x dans l'appel de la portée (dans ce cas l'environnement mondial)

, Vous pouvez contourner ce problème en utilisant ( ou { ou force

dt[(x)]
dt[{x}]
dt[force(x)]
29
répondu mnel 2018-03-08 15:38:40

x n'est pas définie dans l'environnement mondial. Si vous essayez ceci,

> with(dt, dt[x])
      x y
1: TRUE 1
2: TRUE 2
3: TRUE 4

Ça marcherait. Ou ceci:

> attach(dt)
> dt[!x]
       x y
1: FALSE 3

Modifier:

Selon la documentation, le paramètre j prend le nom de la colonne, en fait:

> dt[x]
Error in eval(expr, envir, enclos) : object 'x' not found
> dt[j = x]
[1]  TRUE  TRUE FALSE  TRUE

Ensuite, le paramètre i prend une expression numérique ou logique (comme x lui-même devrait l'être), mais il semble qu'il (data.table) ne peut pas voir x comme logique sans ceci:

> dt[i = x]
Error in eval(expr, envir, enclos) : object 'x' not found
> dt[i = as.logical(x)]
      x y
1: TRUE 1
2: TRUE 2
3: TRUE 4
4
répondu Michele 2013-04-24 12:06:49

Cela devrait également fonctionner et est sans doute plus naturel:

setkey(dt, x)
dt[J(TRUE)]
dt[J(FALSE)]
2
répondu Rico 2014-02-10 11:42:48