r - 在 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)。
解决方案
分组应该是分开的,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
推荐阅读
- typescript - 使用 redux 时我在哪里初始化 props 值,而不会让我的 props 泄漏到 redux 方面
- jasper-reports - iReport - 如何防止 texfield 进入下一页
- javascript - 使用 push 从数组数组中获取值
- python-3.x - 如果 list1 的两个随机元素存在于 list 2 中,会这样吗?
- join - PySpark 动态连接条件
- reactjs - Material UI React-Autosuggest Scrollbar 在选择选项箭头键时不起作用
- c# - 处理 Akka.NET Actor 响应来自流的异步请求时引发的异常
- javascript - 如何在 javascript 中将授权标头传递给 WCF 服务?
- reactjs - SyntaxError: 意外的标识符 {import React from 'react';
- python - PyQt5 中的 itemAt() 和 takeAt() 有什么区别?