data.table学习笔记1

为什么要学习data.table

一直使用这个包的fread函数, 读取数据确实很快, fwrite写入也非常快. 看到大牛在用data.table的key功能, 感觉这个包还有很多需要学习的地方, 利用网上的信息, 加上自己的操作, 记录学习的过程.

语法特点

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
V1V2V3V4
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.230210
1 B 1.558711
2 C 0.070512

2, 通过i来进行行的筛选

如果只有一个值, 不用加逗号, 默认的是选取行.

DT[2]
V1V2V3V4
2 B -0.23022
DT[2,]
V1V2V3V4
2 B -0.23022

选择3:5行的数据

DT[3:5]
V1V2V3V4
1 C 1.55873
2 A 0.07054
1 B -0.56055
DT[3:5,]
V1V2V3V4
1 C 1.55873
2 A 0.07054
1 B -0.56055

根据V2列的值, 选择V2==A的数据

DT[V2=="A"]
V1V2V3V4
1 A -0.5605 1
2 A 0.0705 4
1 A 1.5587 7
2 A -0.230210
DT[V2=="A",]
V1V2V3V4
1 A -0.5605 1
2 A 0.0705 4
1 A 1.5587 7
2 A -0.230210

根据V2列的值, 选择V2==A或者C的数据

DT[V2=="A"|V2=="C"]
V1V2V3V4
1 A -0.5605 1
1 C 1.5587 3
2 A 0.0705 4
2 C -0.2302 6
1 A 1.5587 7
1 C -0.5605 9
2 A -0.230210
2 C 0.070512
DT[V2 %in% c("A","C")]
V1V2V3V4
1 A -0.5605 1
1 C 1.5587 3
2 A 0.0705 4
2 C -0.2302 6
1 A 1.5587 7
1 C -0.5605 9
2 A -0.230210
2 C 0.070512

3, 通过j来进行列的筛选

选择第二列

DT[,2]
V2
A
B
C
A
B
C
A
B
C
A
B
C

选择第二列, 第三列

DT[,2:3]
V2V3
A -0.5605
B -0.2302
C 1.5587
A 0.0705
B -0.5605
C -0.2302
A 1.5587
B 0.0705
C -0.5605
A -0.2302
B 1.5587
C 0.0705
DT[,c(2,3)]
V2V3
A -0.5605
B -0.2302
C 1.5587
A 0.0705
B -0.5605
C -0.2302
A 1.5587
B 0.0705
C -0.5605
A -0.2302
B 1.5587
C 0.0705

可以使用列名进行选择, 但是直接选择是向量

DT[,V1]
  1. 1
  2. 2
  3. 1
  4. 2
  5. 1
  6. 2
  7. 1
  8. 2
  9. 1
  10. 2
  11. 1
  12. 2

如果是多个名称, 返回的也是向量, 如果想要DT格式, 需要用list或者.()的形式

DT[,c(V1,V2)]
  1. '1'
  2. '2'
  3. '1'
  4. '2'
  5. '1'
  6. '2'
  7. '1'
  8. '2'
  9. '1'
  10. '2'
  11. '1'
  12. '2'
  13. 'A'
  14. 'B'
  15. 'C'
  16. 'A'
  17. 'B'
  18. 'C'
  19. 'A'
  20. 'B'
  21. 'C'
  22. 'A'
  23. 'B'
  24. 'C'
DT[,list(V1,V2)]
V1V2
1A
2B
1C
2A
1B
2C
1A
2B
1C
2A
1B
2C
DT[,.(V1,V2)]
V1V2
1A
2B
1C
2A
1B
2C
1A
2B
1C
2A
1B
2C

这里注意, .()为list()的一个别名, 在选择列时, 如果使用.()返回的是DT对象, 如果不使用.()则返回的是一个向量

3, 在j上调用函数

DT[,sum(V1)]

18

以向量的形式返回V1列中所有元素的总和

DT[,.(sum(V1),sd(V3))]
V1V2
18 0.8462588

可以赋予名称

DT[,.(he =sum(V1),xx=sd(V3))]
hexx
18 0.8462588

4, 根据分组来操作j

DT[,.(V4.Sum = sum(V4)),by=V1]
V1V4.Sum
1 36
2 42
DT
V1V2V3V4
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.230210
1 B 1.558711
2 C 0.070512

这个类似:

sum(DT[V1==1,4]);
sum(DT[V1==2,4])

36

42

使用函数.N来得到每个类别的总观测数

DT[,.N,by=V1]
V1N
16
26

5.使用:=引用来添加或更新一列

如果想要在原来列的基础上, 生成新的列, 可以使用:=

相当于原位编辑, 保存为对象DT,DTV5=DTV5=DTV5=DTV4^2

DT[,V5:=V4^2]

DT
V1V2V3V4V5
1 A -0.5605 1 1
2 B -0.2302 2 4
1 C 1.5587 3 9
2 A 0.0705 4 16
1 B -0.5605 5 25
2 C -0.2302 6 36
1 A 1.5587 7 49
2 B 0.0705 8 64
1 C -0.5605 9 81
2 A -0.230210 100
1 B 1.558711 121
2 C 0.070512 144

删除第五列

DT[,V5:=NULL]
DT
V1V2V3V4
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.230210
1 B 1.558711
2 C 0.070512
DT[,V5:=V4^2]

DT
V1V2V3V4V5
1 A -0.5605 1 1
2 B -0.2302 2 4
1 C 1.5587 3 9
2 A 0.0705 4 16
1 B -0.5605 5 25
2 C -0.2302 6 36
1 A 1.5587 7 49
2 B 0.0705 8 64
1 C -0.5605 9 81
2 A -0.230210 100
1 B 1.558711 121
2 C 0.070512 144
DT[,5:=NULL]
DT
V1V2V3V4
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.230210
1 B 1.558711
2 C 0.070512

这里, 删除可以是第五列的名称(V5), 也可以是第五列(5)

6, 使用.N指定最后一行

DT[.N]
V1V2V3V4
2 C 0.070512

选择倒数5行

DT[.N-5:.N]
V1V2V3V4
1 A 1.55877
2 C -0.23026
1 B -0.56055
2 A 0.07054
1 C 1.55873
2 B -0.23022
1 A -0.56051

总结

  • 1, data.table不仅仅fread和fwrite强大, 进行行和列筛选时, 也很强大

  • 2, 默认一个参数时, 是指定的行, 行默认是返回的DT, 如果是列名时, 默认返回的向量,可以用list或者.()进行定义

  • 3, 使用:=进行原位编辑, 可以更新列, 生成新列, 删除列

  • 4, .N这是最后一列, 是一个简化的符号, 比较方便

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值