data.table 中的特殊符号
.SD
.SD
是指每个组的 data.table
的子集,不包括 by
中使用的所有列。
.SD
和 lapply
可用于将任何函数应用于 data.table
中的多个列
我们将继续使用相同的内置数据集 mtcars
:
mtcars = data.table(mtcars) # Let's not include rownames to keep things simpler
数据集中所有列的平均值按柱面数计算,cyl
:
mtcars[ , lapply(.SD, mean), by = cyl]
# cyl mpg disp hp drat wt qsec vs am gear carb
#1: 6 19.74286 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286 0.4285714 3.857143 3.428571
#2: 4 26.66364 105.1364 82.63636 4.070909 2.285727 19.13727 0.9090909 0.7272727 4.090909 1.545455
#3: 8 15.10000 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000 0.1428571 3.285714 3.500000
除了 cyl
之外,数据集中还有其他分类列,如 vs
,am
,gear
和 carb
。采取这些列的 mean
并没有多大意义。所以我们排除这些列。这是 .SDcols
进入图片的地方。
.SDcols
.SDcols
指定 .SD
中包含的 data.table
的列。
数据集中所有列(连续列)的平均值由齿轮数量 gear
和气缸数量 cyl
组成,由 gear
和 cyl
排列:
# All the continuous variables in the dataset
cols_chosen <- c("mpg", "disp", "hp", "drat", "wt", "qsec")
mtcars[order(gear, cyl), lapply(.SD, mean), by = .(gear, cyl), .SDcols = cols_chosen]
# gear cyl mpg disp hp drat wt qsec
#1: 3 4 21.500 120.1000 97.0000 3.700000 2.465000 20.0100
#2: 3 6 19.750 241.5000 107.5000 2.920000 3.337500 19.8300
#3: 3 8 15.050 357.6167 194.1667 3.120833 4.104083 17.1425
#4: 4 4 26.925 102.6250 76.0000 4.110000 2.378125 19.6125
#5: 4 6 19.750 163.8000 116.5000 3.910000 3.093750 17.6700
#6: 5 4 28.200 107.7000 102.0000 4.100000 1.826500 16.8000
#7: 5 6 19.700 145.0000 175.0000 3.620000 2.770000 15.5000
#8: 5 8 15.400 326.0000 299.5000 3.880000 3.370000 14.5500
也许我们不想按群体计算 mean
。要计算数据集中所有汽车的平均值,我们不指定 by
变量。
mtcars[ , lapply(.SD, mean), .SDcols = cols_chosen]
# mpg disp hp drat wt qsec
#1: 20.09062 230.7219 146.6875 3.596563 3.21725 17.84875
注意:
- 没有必要事先定义
cols_chosen
。.SDcols
可以直接获取列名 .SDcols
也可以直接采用列数的向量。在上面的例子中,这将是mtcars[ , lapply(.SD, mean), .SDcols = c(1,3:7)]
.N
.N
是组中行数的简写。
iris[, .(count=.N), by=Species]
# Species count
#1: setosa 50
#2: versicolor 50
#3: virginica 50