Subset data.table by logical column

雨燕双飞 提交于 2019-11-26 16:39:51

问题


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]

回答1:


From ?data.table

Advanced: When i is a single variable name, it is not considered an expression of column names and is instead evaluated in calling scope.

So dt[x] will try to evaluate x in the calling scope (in this case the global environment)

You can get around this by using ( or { or force

dt[(x)]
dt[{x}]
dt[force(x)]



回答2:


x is not defined in the global environment. If you try this,

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

It would work. Or this:

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

EDIT:

according to the documentation the j parameter takes column name, in fact:

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

then, the i parameter takes either numerical or logical expression (like x itself should be), however it seems it (data.table) can't see x as logical without this:

> 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



回答3:


This should also work and is arguably more natural:

setkey(dt, x)
dt[J(TRUE)]
dt[J(FALSE)]


来源:https://stackoverflow.com/questions/16191083/subset-data-table-by-logical-column

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!