为什么继续学习data.table
我发现很多东西, 你只有达到一定的深度, 然后才可以理解, 但是很遗憾, 现实生活中有许多东西我只是泛泛而谈, 人云亦云, 修炼好久才有一种渐入佳境的感触, 但也是稍纵即逝.
然后我发现, 其实进入佳境还有一种方法, 那就是持续不断的思考, 终有一天会恍然大悟. 就像挖井, 打一枪换一个地方, 窝还没有暖热就换, 只能是三天打鱼两天晒网. 所以, 要不断折腾, 我一直相信: 人总会找到自己的路.
语法特点
data.table的通用格式: DT[i, j, by],对于数据集DT,选取子集行i,通过by分组计算j
1, 生成一个data.table格式的对象, 下面用DT为data.table格式的简写
library(data.table)
set.seed(123)
DT <- data.table(V1=c(1,2),V2=c("A","B","C"),V3=round(rnorm(4),4), V4=1:12)
DT
V1 | V2 | V3 | V4 |
1 | A | -0.5605 | 1 |
2 | B | -0.2302 | 2 |
1 | C | 1.5587 | 3 |
2 | A | 0.0705 | 4 |
1 | B | -0.5605 | 5 |
2 | C | -0.2302 | 6 |
1 | A | 1.5587 | 7 |
2 | B | 0.0705 | 8 |
1 | C | -0.5605 | 9 |
2 | A | -0.2302 | 10 |
1 | B | 1.5587 | 11 |
2 | C | 0.0705 | 12 |
2, 对某一列进行筛选时, 使用setkey相当于格式化, 更容易筛选
比如要筛选V2==A的值
setkey(DT,V2)
这里什么也没有返回, 但是现在就可以对V2进行筛选了
DT["A"] # 相当于DT[V2==A]
V1 | V2 | V3 | V4 |
1 | A | -0.5605 | 1 |
2 | A | 0.0705 | 4 |
1 | A | 1.5587 | 7 |
2 | A | -0.2302 | 10 |
选择V2A或者V2C
DT[c("A","C")]V1 | V2 | V3 | V4 |
1 | A | -0.5605 | 1 |
2 | A | 0.0705 | 4 |
1 | A | 1.5587 | 7 |
2 | A | -0.2302 | 10 |
1 | C | 1.5587 | 3 |
2 | C | -0.2302 | 6 |
1 | C | -0.5605 | 9 |
2 | C | 0.0705 | 12 |
mult参数
mult参数是用来控制i匹配到的哪一行的返回结果默认情况下会返回该分组的所有元素
返回匹配到键值所在列(V2列)所有行中的第一行
DT["A",mult="first"]
V1 | V2 | V3 | V4 |
1 | A | -0.5605 | 1 |
DT["A",mult="last"]
V1 | V2 | V3 | V4 |
2 | A | -0.2302 | 10 |
使用setkey()设置一个多列主键
DT
V1 | V2 | V3 | V4 |
1 | A | -0.5605 | 1 |
2 | A | 0.0705 | 4 |
1 | A | 1.5587 | 7 |
2 | A | -0.2302 | 10 |
2 | B | -0.2302 | 2 |
1 | B | -0.5605 | 5 |
2 | B | 0.0705 | 8 |
1 | B | 1.5587 | 11 |
1 | C | 1.5587 | 3 |
2 | C | -0.2302 | 6 |
1 | C | -0.5605 | 9 |
2 | C | 0.0705 | 12 |
setkey(DT,V1,V2)
利用V1和V2进行筛选, 比如筛选V11, V2A的数据
DT[.(1,"A")]
V1 | V2 | V3 | V4 |
1 | A | -0.5605 | 1 |
1 | A | 1.5587 | 7 |
利用V1和V2进行筛选, 比如筛选V11, V2A或者C的数据
DT[.(1,c("A","C"))]V1 | V2 | V3 | V4 |
1 | A | -0.5605 | 1 |
1 | A | 1.5587 | 7 |
1 | C | 1.5587 | 3 |
1 | C | -0.5605 | 9 |
注意, 这里要使用.()或者list
去掉DT的key
setkey(DT,NULL)
3, 使用!或者-反选的删除方法
删除第二列
DT[,!"V2"]
V1 | V3 | V4 |
1 | -0.5605 | 1 |
1 | 1.5587 | 7 |
1 | -0.5605 | 5 |
1 | 1.5587 | 11 |
1 | 1.5587 | 3 |
1 | -0.5605 | 9 |
2 | 0.0705 | 4 |
2 | -0.2302 | 10 |
2 | -0.2302 | 2 |
2 | 0.0705 | 8 |
2 | -0.2302 | 6 |
2 | 0.0705 | 12 |
DT[,-"V2"]
V1 | V3 | V4 |
1 | -0.5605 | 1 |
1 | 1.5587 | 7 |
1 | -0.5605 | 5 |
1 | 1.5587 | 11 |
1 | 1.5587 | 3 |
1 | -0.5605 | 9 |
2 | 0.0705 | 4 |
2 | -0.2302 | 10 |
2 | -0.2302 | 2 |
2 | 0.0705 | 8 |
2 | -0.2302 | 6 |
2 | 0.0705 | 12 |
4, 使用on=.()进行筛选
这里的on=.(), 相当于列的过滤
DT
V1 | V2 | V3 | V4 |
1 | A | -0.5605 | 1 |
1 | A | 1.5587 | 7 |
1 | B | -0.5605 | 5 |
1 | B | 1.5587 | 11 |
1 | C | 1.5587 | 3 |
1 | C | -0.5605 | 9 |
2 | A | 0.0705 | 4 |
2 | A | -0.2302 | 10 |
2 | B | -0.2302 | 2 |
2 | B | 0.0705 | 8 |
2 | C | -0.2302 | 6 |
2 | C | 0.0705 | 12 |
DT["A",on=.(V2)]
V1 | V2 | V3 | V4 |
1 | A | -0.5605 | 1 |
1 | A | 1.5587 | 7 |
2 | A | 0.0705 | 4 |
2 | A | -0.2302 | 10 |
去掉V2==A的行
DT[!"A",on=.(V2)]
V1 | V2 | V3 | V4 |
1 | B | -0.5605 | 5 |
1 | B | 1.5587 | 11 |
1 | C | 1.5587 | 3 |
1 | C | -0.5605 | 9 |
2 | B | -0.2302 | 2 |
2 | B | 0.0705 | 8 |
2 | C | -0.2302 | 6 |
2 | C | 0.0705 | 12 |
两个条件过滤, V11, V2A
DT[.(1,"A"),on=.(V1,V2)]
V1 | V2 | V3 | V4 |
1 | A | -0.5605 | 1 |
1 | A | 1.5587 | 7 |
这里, 要使用.()进行筛选
两个条件过滤, V11, V2c(A,C)
DT[.(1,c("A","C")),on=.(V1,V2)]V1 | V2 | V3 | V4 |
1 | A | -0.5605 | 1 |
1 | A | 1.5587 | 7 |
1 | C | 1.5587 | 3 |
1 | C | -0.5605 | 9 |
总结
- setkey进行设置键, 然后可以用于排序和筛选, 特别是行筛选
- setkey可以进行多列的格式化
- on=可以针对列进行筛选, 可以多条件的筛选
















