我有一个大的data.table,我经常用它进行编程,并重复执行以下操作:
d.regionOffice <- d.input[, .(sales = sum(sales)), .(region, office)]
d.region <- d.regionOffice[, .(sales = sum(sales)), .(region)]
除了sales = sum(sales)
之外,我还有其他变量,它们经常被重复使用,通常具有更长的变量名。
有没有一种方法可以捕获这个常见的构造,然后在data.table中使用?
我尝试过一些天真的东西,比如:
l.sales <- list(sales = sum(sales))
但R会给你一个错误,说"错误:找不到对象‘sales’"。这方面有什么办法吗?
请注意,我有多个常见的汇总统计信息,例如profit = sum(profit)
、customers = sum(customers)
等,所以一个只需要by
参数的自定义函数是不够好的。
如果我理解正确的话,OP正在寻找一条用更少的类型创建聚合的捷径。
而不是键入
library(data.table)
DT <- as.data.table(iris)
DT[, .(Sepal.Length = mean(Sepal.Length), Petal.Length = mean(Petal.Length)), by = Species]
Species Sepal.Length Petal.Length 1: setosa 5.006 1.462 2: versicolor 5.936 4.260 3: virginica 6.588 5.552
我们可以写
cols <- c("Sepal.Length", "Petal.Length")
DT[, lapply(.SD, mean), .SDcols = cols, by = Species]
Species Sepal.Length Petal.Length 1: setosa 5.006 1.462 2: versicolor 5.936 4.260 3: virginica 6.588 5.552
为了方便起见,这可以放在一个函数中:
agg <- function(dt, cols, grp, fct = sum) {
dt[, lapply(.SD, fct), .SDcols = cols, by = grp]
}
agg(DT, cols, "Species", mean)
D_8D_10Species Sepal.Length Petal.Length 1: setosa 5.006 1.462 2: versicolor 5.936 4.260 3: virginica 6.588 5.552
或者,使用另一个数据表
DT2 <- as.data.table(mtcars, keep.rownames = TRUE)
agg(DT2, c("wt", "hp"), "cyl", sum)
D_14cyl wt hp 1: 6 21.820 856 2: 4 25.143 909 3: 8 55.989 2929
另一种解决方案是只在R中使用代码片段。最初的问题是减少重复键入的数量,这可以使用上面的解决方案以编程方式完成,也可以使用RStudio中的代码片段以半手动方式完成。
在RStudio中,转到:工具>全局选项>代码>编辑代码段(底部(
然后添加一个片段,例如
snippet gwp
gross.written.premium = sum(gross.written.premium)
然后,当您键入代码时,您可以只键入gwp
[tab],它将扩展到完整的代码。