我评论了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
并且是一个整数。为什么这样做?
您需要使用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))
时,将对该表达式求值并作为向量返回。
应该在某个地方有一个骗局