为什么继续学习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=可以针对列进行筛选, 可以多条件的筛选