首页 > 解决方案 > 在 data.table 中由 n 个不同的组创建 n 个新列

问题描述

我有以下数据表,并想对 y 求和两次,一次按 g1分组,第二次按 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)。

标签: rdata.table

解决方案


分组应该是分开的,a a并且a b被视为独特的元素,因此,每组只有一个观察值

for(i in seq_along(group_cols)) DT[, (new_cols[i]) := sum(y), by = c(group_cols[i])]

-输出

DT
   g1 g2 y sum_by_g1 sum_by_g2
1:  a  a 3         3         8
2:  b  a 5         5         8

推荐阅读