繁体   English   中英

子集data.table按逻辑列

[英]Subset data.table by logical column

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

?data.table

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

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

您可以使用({force

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

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视为逻辑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

这也应该起作用,并且可以说是更自然的:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM