【发布时间】:2021-08-05 19:43:06
【问题描述】:
我有以下数据表,想对 y 求和两次,将 first 时间按 g1 分组,将 second 时间按 g2 分组。
通常我会将计算链接在一起,但我希望能够按 n 个组在不同时间进行分组总和。
library(data.table)
DT <- data.table(
g1 = c("a", "b"),
g2 = c("a", "a"),
y = c(3,5)
)
new_cols <- paste0("sum_by_", c("g1", "g2"))
group_cols <- c("g1", "g2")
# Supplying cols to by like this groups by g1 AND g2, when in reality I want it to
# take g1 the first time and g2 the second time.
DT[, paste(new_cols) := lapply(rep(y, length(new_cols)), sum),
by = .(group_cols)][]
这给了我:
# g1 g2 y sum_by_g1 sum_by_g2
# 1: a a 3 3 3
# 2: b a 5 5 5
当我真正想要的时候:
# g1 g2 y sum_by_g1 sum_by_g2
# 1: a a 3 3 8
# 2: b a 5 5 8
是否有任何巧妙的 data.table 方法可以做到这一点? 类似的东西向 by 提供 .SD(这本身似乎不起作用)?
编辑:将 y 从 c(1,1) 更改为 c(3,5)
编辑原理:当 y = c(1,1) 时的实际和期望输出给人的印象是我想计算每个组中的观察值,而实际上我想为每个组求和(y)。
【问题讨论】:
-
@akrun 因为第二个的 sum_by_g2 是组 g2 == "a" 的 y 的总和。 (length() 只是为了给 y lapply 正确的次数。也许这也是不好的形式?)
-
我知道您想要的结果是 wide 格式,但我只想提一下
data.table工具箱中的另一项:groupingsets,它给出了答案long 格式。在这里我们可以做类似groupingsets(DT, j = sum(y), by = c("g1", "g2"), sets = list("g1", "g2"))的事情。
标签: r data.table