我说了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
并且是整数。为什么这样做呢?
答案 0 :(得分:1)
您需要按以下方式使用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,具有= FALSE]和x [,.SD,.SDcols = cols]。
由于c(2,1,3:100L)
是数字列,因此不需要with=FALSE
,并且会自动返回这些列。为c(2,1,3:ncol(df))
时,该表达式将被求值并作为向量返回。
在某处应该有骗子