我想知道当我使用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")]
答案 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)