r - R循环/lapply,按分组累积总计
问题描述
我正在尝试在我的数据集中创建新变量,这些变量是基于其他变量(使用分组依据)重新启动的累积总数......我希望这些成为数据集中的新列,这是我正在努力解决的部分......
使用下面的数据,我想为每个 Product 和 Product_Cat 分组创建累积销售和利润列。
下面的代码部分地给了我我需要的东西,但变量不是新变量,而是覆盖现有的销售/利润......我错了什么?我想这很简单,没有发现任何东西。
注意:我使用 lapply 因为我的真实数据集有 40 多个变量,我需要为其创建计算。
DT <- setDT(Data)[,lapply(.SD, cumsum), by = .(Product,Product_Cat) ]
数据举例:
Product <- c('A','A','A','B','B','B','C','C','C')
Product_Cat <- c('S1','S1','S2','C1','C1','C1','D1','E1','F1')
Sale <- c(10,15,5,20,15,10,5,5,5)
Profit <- c(2,4,2,6,8,2,4,6,8)
Sale_Cum <- c(10,25,5,20,35,45,5,5,5)
Profit_Cum <- c(2,6,2,6,14,16,4,6,8)
Data <- data.frame(Product,Product_Cat,Sale,Profit)
Desired_Data <- data.frame(Product,Product_Cat,Sale,Profit,Sale_Cum,Profit_Cum)
解决方案
这本身并不使用 group by ,但我认为它可以实现您正在寻找的内容,因为它很容易扩展到许多列:
D2 <- data.frame(lapply(Data[,c(3,4)], cumsum))
names(D2) <- gsub("$", "_cum", names(Data[,c(3,4)]))
Data <- cbind(Data, D2)
如果您有 40 多列,只需更改 c(3,4) 以包含您之后的所有列。
编辑:
我忘记了 OP 希望它为每个类别重置。在这种情况下,您可以修改原始代码:
DT <- setDT(Data)[,lapply(.SD, cumsum), by = .(Product,Product_Cat) ]
names(D2)[c(-1,-2)] <- gsub("$", "_cum", names(Data)[c(-1,-2)])
cbind(Data, D2[,c(-1,-2)])
推荐阅读
- visual-studio-code - 由于 Nmake 错误,Raspberry pico 无法编译
- java - 上传时握手期间远程主机关闭连接
- mybatis - Mybatis insert into ... select from ... 返回主键
- pandas - 根据 2 个 pandas 列的比较在 matplotlib 中绘制一条线
- discord - 我如何制作一个响应特定用户的机器人?不和谐.py
- c# - 在excel中更快地读取数据行的问题
- powerbi - 在直接查询模式下下载 Power BI 中的数据集块
- javascript - 将 ID 分配给为数据表动态创建的选项
- apache-spark - 在 dataproc 集群中,我在哪里配置 spark 执行器和 spark 作业的执行器内存?
- reactjs - 使用 Fetch 和 Typescript 进行类型推断