r语言 - 分组时 data.table j 参数的预编程组件



我有一个大的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)
Species Sepal.Length Petal.Length
1:     setosa        5.006        1.462
2: versicolor        5.936        4.260
3:  virginica        6.588        5.552
D_8D_10

或者,使用另一个数据表

DT2 <- as.data.table(mtcars, keep.rownames = TRUE)
agg(DT2, c("wt", "hp"), "cyl", sum)
cyl     wt   hp
1:   6 21.820  856
2:   4 25.143  909
3:   8 55.989 2929
D_14

另一种解决方案是只在R中使用代码片段。最初的问题是减少重复键入的数量,这可以使用上面的解决方案以编程方式完成,也可以使用RStudio中的代码片段以半手动方式完成。

在RStudio中,转到:工具>全局选项>代码>编辑代码段(底部(

然后添加一个片段,例如

snippet gwp
gross.written.premium = sum(gross.written.premium)

然后,当您键入代码时,您可以只键入gwp[tab],它将扩展到完整的代码。

最新更新