首页 > 解决方案 > 奇怪的data.table列选择

问题描述

我注意到一个data.table我不明白的奇怪行为:

library(data.table)
df <- as.data.table(matrix(ncol = 100,nrow = 3,data = sample(letters,300,replace = T)))

如果我想反转前两列,我可以这样做:

df[,c(2,1,3:100L)]

效果很好。但如果我这样做:

df[,c(2,1,3:ncol(df))]

  [1]   2   1   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32
 [33]  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64
 [65]  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96
 [97]  97  98  99 100

我不明白,因为ncol(df)is100和 是一个整数。为什么这样做?

标签: rdata.table

解决方案


您需要with=FALSE按如下方式使用:

df[,c(2,1,3:ncol(df)),with=FALSE]

?data.table, 在参数下with

当 j 是列名的字符向量时,要选择的列位置的数值向量或 startcol:endcol 的形式,并且返回的值始终是 data.table。with=FALSE 不再需要动态选择列。请注意,x[, cols] 等价于 x[, ..cols] 和 x[, cols, with=FALSE] 和 x[, .SD, .SDcols=cols]。

由于c(2,1,3:100L)是数字列,with=FALSE因此不需要,并且列会自动返回。当它是 时c(2,1,3:ncol(df)),这个表达式将被计算并作为一个向量返回。

应该在某处受骗


推荐阅读