name - Subset data.table por columna lógica
subset r table (3)
De ?data.table
Avanzado: cuando
i
es un solo nombre de variable, no se considera una expresión de nombres de columna y, en cambio, se evalúa en el ámbito de la llamada.
Así que dt[x]
intentará evaluar x
en el alcance de la llamada (en este caso, el entorno global)
Puedes evitar esto usando (
o {
o force
dt[(x)]
dt[{x}]
dt[force(x)]
Tengo una data.table
con una columna lógica. ¿Por qué el nombre de la columna lógica no se puede usar directamente para el argumento i
? Vea el ejemplo.
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]
Esto también debería funcionar y es posiblemente más natural:
setkey(dt, x)
dt[J(TRUE)]
dt[J(FALSE)]
x
no está definido en el entorno global. Si intentas esto,
> with(dt, dt[x])
x y
1: TRUE 1
2: TRUE 2
3: TRUE 4
Funcionaría. O esto:
> attach(dt)
> dt[!x]
x y
1: FALSE 3
EDITAR:
De acuerdo con la documentación, el parámetro j
toma el nombre de la columna, de hecho:
> dt[x]
Error in eval(expr, envir, enclos) : object ''x'' not found
> dt[j = x]
[1] TRUE TRUE FALSE TRUE
luego, el parámetro i
toma una expresión numérica o lógica (como la propia x debería ser), sin embargo, parece que (data.table) no puede ver x
como lógica sin esto:
> 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