我有一个带有逻辑列的data.table
。为什么逻辑列的名称不能直接用于i
参数?参见示例。
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]
答案 0 :(得分:30)
来自?data.table
高级:当
i
是单个变量名称时,它不被视为一个 列名的表达式,而是在调用范围中计算。
因此dt[x]
将尝试评估调用范围中的x
(在本例中为全局环境)
您可以使用(
或{
或force
dt[(x)]
dt[{x}]
dt[force(x)]
答案 1 :(得分:4)
x
未在全球环境中定义。如果你试试这个,
> with(dt, dt[x])
x y
1: TRUE 1
2: TRUE 2
3: TRUE 4
它会起作用。或者这个:
> attach(dt)
> dt[!x]
x y
1: FALSE 3
编辑:
根据文档,j
参数采用列名,实际上是:
> dt[x]
Error in eval(expr, envir, enclos) : object 'x' not found
> dt[j = x]
[1] TRUE TRUE FALSE TRUE
然后,i
参数采用数字或逻辑表达式(就像x本身应该),但似乎它(data.table)看不到x
是逻辑的,没有这个:
> 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
答案 2 :(得分:2)
这也应该有效,可以说更自然:
setkey(dt, x)
dt[J(TRUE)]
dt[J(FALSE)]