【问题标题】:data.table subsetting rows using a logical column: why do I have to explicitly compare with TRUE? [duplicate]使用逻辑列的 data.table 子集行:为什么我必须明确地与 TRUE 比较? [复制]
【发布时间】:2015-01-16 17:34:52
【问题描述】:

我想知道为什么对于给定的 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 包的行为是否正确?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    改用这个:

    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(`(`)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-26
      • 2013-04-17
      • 2014-04-25
      • 1970-01-01
      • 2019-05-28
      • 2016-03-11
      • 1970-01-01
      • 2013-03-30
      相关资源
      最近更新 更多