r - 汇总 data.table .SD,同时按 .SDcols 之一排序
问题描述
如何在按 .SDcols 中的第一个排序时计算 .SD 列的累积总和(不对第一列求和)
举个玩具例子:
require(data.table)
dt<-data.table(expand.grid(dow = 1:5, person = c("alice", "bob")))
setcolorder(dt, c("person", "dow"))
dt[, `:=`(current1 = runif(nrow(dt)), current2 = runif(nrow(dt)))]
求和前的数据:
person dow current1 current2
1: alice 1 0.266 0.9447
2: alice 2 0.372 0.6608
3: alice 3 0.573 0.6291
4: bob 1 0.908 0.0618
5: bob 2 0.202 0.2060
6: bob 3 0.898 0.1766
dt[order(dow), lapply(.SD, cumsum), by = c("person")]
产生 和 的所需累积current1
总和current2
:
person dow current1 current2
1: alice 1 0.266 0.9447
2: alice 3 0.638 1.6055
3: alice 6 1.210 2.2346
4: bob 1 0.908 0.0618
5: bob 3 1.110 0.2678
6: bob 6 2.008 0.4443
而且,不希望地,总和dow
。
dt[order(dow), lapply(.SD, cumsum), by = c("person"), .SDcols = c("current1", "current2")]
下降dow
山口。总而言之。
所需的输出应该对 dow 列进行排序但不求和。
解决方案
我们可以通过赋值运算符指定感兴趣的列.SDcols
并更新其他列,:=
以在适当的位置分配输出值
dt[order(dow), c('current1', 'current2') := lapply(.SD, cumsum),
by = .(person), .SDcols = current1:current2]
注意:使用的函数是cumsum
,因此它将生成与原始数据集中相同的行数
推荐阅读
- php - 如何连接动态变量名?
- android - 如何测量对 findViewByID 的额外调用 - RecyclerView
- http - 关于 ::http::geturl 令牌的使用
- django - 如何使用基于函数的视图删除对象?
- hadoop - 为什么 Hbase 不使用集群中的所有节点?
- julia - 具有多变量功能输入的一维集成
- javascript - array.includes 返回 false ,其中搜索的名称在数组中
- powershell - 我想在 Jenkins 中执行我的 powershell 脚本并显示结果 OK/NOK
- c# - Unity 容器中的方法重载
- r - 当有 3 列时,R 中的插值