r - R:data.table 中的透视和小计?
问题描述
透视和小计是电子表格和 SQL 中常见的辅助步骤。
假设一个带有字段的 data.table date, myCategory, revenue
。假设您想知道日收入占所有收入的比例以及不同子组内的日收入比例,这样
b[,{
#First auxiliary variable of all revenue
totalRev = sum(revenue) #SUBGROUP OF ALL REV
#Second auxiliary variable of revenue by date, syntax wrong! How to do this?
{totalRev_date=sum(revenue), by=list(date)} #DIFFERENT SUBGROUP, by DATE's rev
#Within the subgroup by date and myCategory, we will use 1st&2nd auxiliary vars
.SD[,.(Revenue_prop_of_TOT=revenue/totalRev,
,Revenue_prop_of_DAY=revenue/totalRev_date) ,by=list(myCategory,date)]
},]
我们需要计算辅助总和,特定日期的所有收入和整个历史的所有收入。
最终结果应如下所示:
date myCategory Revenue_prop_of_TOT Revenue_prop_of_DAY
2019-01-01 Cat1 0.002 0.2
...
您会看到辅助变量只是帮助功能。
如何在 R data.table 中旋转和计算小计?
解决方案
另一个选项使用data.table::cube
:
cb <- cube(DT, sum(value), by=c("date","category"), id=TRUE)
cb[grouping==0L, .(date, category,
PropByDate = V1 / cb[grouping==1L][.SD, on="date", x.V1],
PropByCategory = V1 / cb[grouping==2L][.SD, on="category", x.V1],
PropByTotal = V1 / cb[grouping==3L, V1]
)]
输出:
date category PropByDate PropByCategory PropByTotal
1: 1 1 0.3333333 0.2500000 0.1
2: 1 2 0.6666667 0.3333333 0.2
3: 2 1 0.4285714 0.7500000 0.3
4: 2 2 0.5714286 0.6666667 0.4
数据:
DT <- data.table(date=c(1, 1, 2, 2), category=c(1, 2, 1, 2), value=1:4)
# date category value
#1: 1 1 1
#2: 1 2 2
#3: 2 1 3
#4: 2 2 4
推荐阅读
- jquery - Boostrap 4 Toast 调用后未显示
- html - 图像不会加载为 CSS 背景
- r - 如何在 r 中并行化外部函数?
- android - Flutter - Android Manifest 中用于 AdMob 支持的语法
- java - 使用泛型实现对象转换器设计模式
- django - /shop/ django 的 NoReverseMatch
- python - 将球形网格插值到常规网格?
- r - 运行模型或计算()火花表时出现“java.lang.OutOfMemoryError:Java 堆空间”
- asp.net-mvc - 在网格 Telerik 的 CRUD 中添加一行后,更新或删除按钮不起作用
- dojo - ReferenceError:模板未定义