【问题标题】:Subset data.table by logical column按逻辑列子集 data.table
【发布时间】:2013-04-17 22:48:51
【问题描述】:

我有一个带有逻辑列的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]

【问题讨论】:

    标签: r data.table subset


    【解决方案1】:

    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
    

    【讨论】:

    • 不确定这是个问题,x 未在全局环境中定义,但dt[x == T] 有效。
    • 你是对的,但是这个错误Error in eval(expr, envir, enclos) : object 'x' not found 表明了这一点。因此,您可能突出显示了一个可能的错误
    • @djhurio 在i 和j 的[.data.table 文档的一部分中,都说expression is evaluated within the frame of the data.table (i.e. it sees column names as if they are variables)。但是,在i 参数中,似乎需要像== 或as.logical 这样的显式表达式。
    【解决方案2】:

    来自?data.table

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

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

    您可以使用( 或{ 或force 来解决此问题

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

    【讨论】:

    • (+1) force 函数的有趣用法。 force 在这种情况下如何工作?它如何改变环境/范围?
    • 更多信息为什么 here.
    • force 基本上停止将其解释为单个变量(这是通过在[.data.table 内的调用上进行一些计算来完成的)force 然后强制评估x,这将返回x 在 data.table 范围内。
    • @e4e5f5 force 之所以有效,是因为它使 i 不再是一个单一的名称。 dt[identity(x)] 会出于同样的原因工作,或者只是 dt[(x)] 是最简单的。我也有点喜欢 := 的 LHS 上的 (x),而不是 with=FALSE,所以 (x) 开始成为惯用的 data.table(尽管它更多的是偶然而不是设计)。
    【解决方案3】:

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

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

    【讨论】:

    • 值得注意的是,设置键和连接的渐近复杂度与对列进行过滤有显着不同。前者需要先对数据进行排序,而后者可以通过线性传递来完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多