使用data.table优化分组

时间:2019-08-22 16:12:21

标签: r data.table

我想知道当我使用group by时在另一列上重复使用某一计算的有效方法是什么。这是一个简化的示例:

dt = data.table(iris)
dt[,.(
  # .N, 
  # sum_len = sum(Sepal.Length), 
  avg_len   = sum(Sepal.Length)/.N,
  var_len   = sum(Sepal.Length^2)/.N - (sum(Sepal.Length)/.N)^2
),by=  "Species"]

在这里,我需要重用sum(Sepal.Length).N而不重新计算。

编辑: 一个更完整的示例是当我们也使用.SD时:

dt[,c(lapply(.SD, mean),lapply(.SD, var)),by="Species",.SDcols = c("Sepal.Length", "Sepal.Width")]

1 个答案:

答案 0 :(得分:3)

一种选择是使用{}并先创建汇总变量('tmp'),然后将其用于进一步的计算

dt[, {
         tmp <- sum(Sepal.Length)/.N
         tmp2 <- sum(Sepal.Length^2)/.N 
        .(avg_len = tmp, var_len = tmp2 -(tmp)^2)
     }, 
        by = Species]
#     Species avg_len  var_len
#1:     setosa   5.006 0.121764
#2: versicolor   5.936 0.261104
#3:  virginica   6.588 0.396256

请注意

tmp <- sum(Sepal.Length)/.N
tmp2 <- sum(Sepal.Length^2)/.N 

等于

tmp <- mean(Sepal.Length)
tmp2 <- mean(Sepal.Length^2)