首先介绍下data.table的语法,如下所示:
内置的 order() 函数 * 我们可以对一个字符型的列,使用减号“-”,来实现降序排列。
# select取子集方法之subset(x, subset, select)
注:subset特指对列的选择,select特指对行的选择, with = FALSE 来引用列名
select列
* 既然列可以作为变量被引用,我们可以直接引用我们想选取的列。
* 既然我们想选取所有的行,则可毋需指定参数 i。
* 返回了所有行的 arr_delay 列。
特殊的语法
.SD: data.table提供一个特殊的语法,形式是 .SD。它是 Subset of Data 的缩写。
它自身就是一个data.table,包含通过by 分组后的每一组。 回忆一下,一个data.table本质上是一个list,它们的列包含的元素个数都相同(其实就是行数)。
说明:
* .SD 包含除了分组依据的那一列以外的所有列。
* 返回值依旧保持了原数据的顺序。首先打印出来的是 ID=“b” 的数据,然后是 ID=“a” 的,最后是 ID=“c” 的。
为了对复数的列进行计算,我们可以简单地使用函数 lapply()。
说明:
* .SD 分别包含了ID是 a、b、c的所有行,它们分别对应了各自的组。我们应用函数 lapply() 对每列计算平均值。
* 每一组返回包含三个平均数的list,这些构成了最终返回的data.table。
* 既然函数 lapply() 返回 list,我们就不需要在外面多加 .() 了。
-如何指定希望计算平均值的列
.SDcols
使用参数 .SDcols。它接受列名或者列索引。比如,.SDcols = c("arr_delay", "dep_delay")能确保.SD之包含 arr_delay 和 dep_delay 这两列。
和 with = FALSE 一样,我们也可以使用 - 或者 ! 来移除列。比如,我们指定 !(colA:colB) 或者 -(colA:colB)表示移除从 colA 到 colB 的所有列。
总结
data.table的语法形式是:
DT[i, j, by]
指定参数i:
* 类似于data.frame,我们可以subset行,除非不需要重复地使用 DT$,既然我们能将列当做变量来引用。
* 我们可以使用order()排序。为了得到更快速的效果,order()函数内部使用了data.table的快速排序。
我们可以通过参数i做更多的事,得到更快速的选取和连结。我们可以在教程“Keys and fast binary search based subsets”和“Joins and rolling joins”中学到这些。
指定参数j:
* 以data.table的形式选取列:DT[, .(colA, colB)]。
* 以data.frame的形式选取列:DT[, c("colA", "colB"), with=FALSE]。
* 按列进行计算:DT[, .(sum(colA), mean(colB))]。
* 如果需要:DT[, .(sA =sum(colA), mB = mean(colB))]。
* 和i共同使用:DT[colA > value, sum(colB)]。
指定参数by:
* 通过by,我们可以指定列,或者列名,甚至表达式,进行分组。参数j可以很灵活地配置参数i和by实现强大的功能。
* by可以指定多个列,也可以指定表达式。
* 我们可以用 keyby,对分组的结果自动排序。
* 我们可以在参数j中指定 .SD 和 .SDcols,对复数的列进行操作。例如:
1.把函数fun 应用到所有 .SDcols指定的列上,同时对参数by指定的列进行分组:DT[, lapply(.SD, fun), by=., .SDcols=...]。
2.返回每组册前两行:DT[, head(.SD, 2), by=.]。
3.三个参数联合使用:DT[col > val, head(.SD, 1), by=.]
小提示:
只要j返回一个list,这个list的每个元素都会是结果data.table的一列。
时间: 2024-10-23 15:58:37