29

I have a data.table with a logical column. Why the name of the logical column can not be used directly for the i argument? See the example.

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]
4

3 回答 3

31

?data.table

高级:当i是单个变量名时,它不被视为列名的表达式,而是在调用范围内进行评估。

所以dt[x]将尝试x在调用范围内进行评估(在这种情况下是全局环境)

您可以使用(or {or来解决这个问题force

dt[(x)]
dt[{x}]
dt[force(x)]
于 2013-04-24T12:13:21.207 回答
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
于 2013-04-24T11:47:59.777 回答
2

这也应该有效,并且可以说更自然:

setkey(dt, x)
dt[J(TRUE)]
dt[J(FALSE)]
于 2014-02-10T11:42:48.637 回答