使用 .SD 和 .SDcols

.SD

.SD 是指每個組的 data.table 的子集,不包括 by 中使用的所有列。

.SDlapply 可用於將任何函式應用於 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 之外,資料集中還有其他分類列,如 vsamgearcarb。採取這些列的 mean 並沒有多大意義。所以我們排除這些列。這是 .SDcols 進入圖片的地方。

.SDcols

.SDcols 指定 .SD 中包含的 data.table 的列。

資料集中所有列(連續列)的平均值由齒輪數量 gear氣缸數量 cyl 組成,由 gearcyl 排列:

# 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 可以直接獲取列名