使用不同数值索引筛选data.table列时的结果差异问题
关于data.table数值索引筛选列的差异解析
咱们先重现你给出的最小示例,方便对照分析:
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
三种写法的差异原因
核心在于data.table对j参数(即方括号里的第二部分)的解析逻辑:
第一种
DT[, c(1:2)]和第三种DT[, 1:2]:这两种写法里,c(1:2)和1:2都是直接生成数值向量,data.table会自动识别这是列索引请求,所以会返回对应位置的列。本质上,这是data.table为了兼容传统data.frame的列选择逻辑做的设计。第二种
DT[, (1:2)]:这里的括号是关键!在data.table的语法规则里,当j部分被括号包裹时,会触发表达式直接求值的模式:先计算括号内的表达式得到结果(也就是向量c(1,2)),然后直接把这个结果返回,而不会将其当作列索引去匹配表格的列。简单说,括号把“列选择请求”变成了“直接返回表达式结果”。
如果想用括号的方式实现列选择,可以用data.table特有的..语法,比如:
DT[, ..(1:2)] # x y # 1: 2 3
这里的..相当于“向上一级查找”,告诉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
内容的提问来源于stack exchange,提问作者mt1022
相关产品推荐
相关产品推荐

