install.packages('data.table')
library(data.table)
data <- read.csv("http://www.ats.ucla.edu/stat/data/hsb2_small.csv")
head(data, 10)
> id female race ses schtyp prog read write math science socst
> 1: 70 0 4 1 1 1 57 52 41 47 57
> 2: 121 1 4 2 1 3 68 59 53 63 61
> 3: 86 0 4 3 1 1 44 33 54 58 31
> 4: 141 0 4 3 1 3 63 44 47 53 56
> 5: 172 0 4 2 1 2 47 52 57 53 61
> 6: 113 0 4 2 1 2 44 52 51 63 61
> 7: 50 0 3 2 1 1 50 59 42 53 61
> 8: 11 0 1 2 1 2 34 46 45 39 36
> 9: 84 0 4 2 1 1 63 57 54 58 51
> 10: 48 0 3 2 1 2 57 55 52 50 51
我们认为它是
class(data)
> [1] "data.frame"
所以我们可以抓住特定的列 (此页面仅显示10行&#39; s示例...)
data[ , c(1, 7, 8)]
> id read write
> 1 70 57 52
> 2 121 68 59
> 3 86 44 33
> 4 141 63 44
> 5 172 47 52
> 6 113 44 52
> 7 50 50 59
> 8 11 34 46
> 9 84 63 57
> 10 48 57 55
或范围(如果您有许多变量,则会很有帮助)
data[ , 3:11]
> race ses schtyp prog read write math science socst
> 1 4 1 1 1 57 52 41 47 57
> 2 4 2 1 3 68 59 53 63 61
> 3 4 3 1 1 44 33 54 58 31
> 4 4 3 1 3 63 44 47 53 56
> 5 4 2 1 2 47 52 57 53 61
> 6 4 2 1 2 44 52 51 63 61
> 7 3 2 1 1 50 59 42 53 61
> 8 1 2 1 2 34 46 45 39 36
> 9 4 2 1 1 63 57 54 58 51
> 10 3 2 1 2 57 55 52 50 51
在我开始使用data.table之前,一切正常。
setDT(data)
class(data)
> [1] "data.table" "data.frame"
如何使用data.table完成类似的子集? 上面相同的代码产生......
data[ , c(1, 7, 8)]
> [1] 1 7 8
data[ , 3:11]
> [1] 3 4 5 6 7 8 9 10 11
我知道dplyr select()但我寻求的解决方案并不涉及键入列名,并且非常欣赏使用&#34;列号对数据进行子集化的明确方法&#34;我偶尔会使用subset(),甚至可以构造用于数据[I,J,by = K]的字符向量J.我肯定错过了什么。代码主人会认为这很简单,并且很容易显示一个灵活的解决方案,例如,可以选择列1,3,5,10到30和97.
答案 0 :(得分:2)
对于data.table,您需要在列子集语句中包含= FALSE。
data[, 3:11, with=FALSE]