奇怪的data.table列选择

问题描述 投票:2回答:1

我评论了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)100并且是一个整数。为什么这样做?

r data.table
1个回答
1
投票

您需要使用with=FALSE如下:

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

来自?data.table,在with的论据下

当j是列名的字符向量时,要选择的列位置的数字向量或表单startcol:endcol的数值向量,以及返回的值始终是data.table。使用= FALSE不再需要动态选择列。请注意,x [,cols]等同于x [,.. cols]和x [,cols,= FALSE]和x [,。SD,.SDcols = cols]。

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

应该在某个地方有一个骗局

© www.soinside.com 2019 - 2024. All rights reserved.