data.table使用逻辑列对行进行子集化:为什么我必须与TRUE明确比较?

时间:2015-01-16 17:34:53

标签: r data.table

我想知道给定data.table的原因:

library(data.table)
DT <- structure(list(number = 1:5, bmask = c(FALSE, TRUE, FALSE, TRUE, 
FALSE)), .Names = c("number", "bmask"), row.names = c(NA, -5L
), class = c("data.table", "data.frame"))

> DT
   number bmask
1:      1 FALSE
2:      2  TRUE
3:      3 FALSE
4:      4  TRUE
5:      5 FALSE

表达式DT[bmask==T,.(out=number)]按预期工作:

   out
1:   2
2:   4

DT[bmask,.(out=number)]会导致错误:

> DT[bmask,.(out=number)]
Error in eval(expr, envir, enclos) : object 'bmask' not found

这是data.table包的正确行为吗?

1 个答案:

答案 0 :(得分:14)

请改用:

DT[(bmask), .(out=number)]
#    out
# 1:   2
# 2:   4

括号的作用是将符号bmask放在函数调用中,从其评估环境中DT的列将是可见的 1 。任何其他函数调用只返回bmask的值(例如c(bmask)I(bmask)bmask==TRUE)或其真实元素的索引(例如which(bmask) )也可以工作,但可能需要稍长的时间来计算。

如果bmask 位于函数调用中,则会在调用范围(此处为全局环境)中搜索它,这有时也很方便。以下是?data.table的相关解释:

  

高级:当'i'是单个变量名时,它不是   被认为是列名的表达而是   在通话范围内进行评估。


1 要查看()本身是函数调用,请键入is(`(`)