【发布时间】:2018-10-23 03:47:20
【问题描述】:
查看最小示例:
library(data.table)
DT <- data.table(x = 2, y = 3, z = 4)
DT[, c(1:2)] # first way
# x y
# 1: 2 3
DT[, (1:2)] # second way
# [1] 1 2
DT[, 1:2] # third way
# x y
# 1: 2 3
正如post 中所述,现在可以使用数字索引对列进行子集化。但是,我想知道为什么以第二种方式而不是列索引将索引评估为向量?
另外,我刚刚更新了data.table:
> sessionInfo()
R version 3.4.4 (2018-03-15)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.4 LTS
Matrix products: default
BLAS: /usr/lib/atlas-base/atlas/libblas.so.3.0
LAPACK: /usr/lib/atlas-base/atlas/liblapack.so.3.0
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.11.2
loaded via a namespace (and not attached):
[1] compiler_3.4.4 tools_3.4.4 yaml_2.1.17
【问题讨论】:
-
我猜这是因为 data.table 中的
jth 部分不仅用于选择列,因此,当您评估它(使用括号)时,您正在告诉数据.table 您想要评估表达式而不是选择特定列。我想,出于这个原因,当您运行DT[, (1:2), verbose = TRUE]时,它会告诉您您没有选择j中的任何列 -
@DavidArenburg,很有可能。但是如果
(1:2)被评估为表达式,c(1:2)也应该被评估为表达式,对吧? -
不这么认为。
c()不评估任何东西,它只是返回一个向量。我猜随着新的变化。 data.table 期望以列表(NSE)的形式接收列名向量,例如DT[, .(x)],或以位置向量或引用列名称 (SE) 的形式分别为DT[, 1]或DT[, c("x")](或只是DT[, "x"])。不过我没有查看源代码,所以不能确定。 -
@DavidArenburg,感谢您的解释。我还试图通过检查它的源代码来找出原因,它太长了,以至于我很难跟踪
j的评估。 :( -
我觉得你可以看看here
标签: r data.table