首页 > 解决方案 > 按组求和 1:n

问题描述

有:我需要为每组中的每一行求和 i:n 的数据集

demo<-data.frame(th=c(c(0,24,26),(c(0,1,2,4))),hs=c(rep(220,3),c(rep(240,4))),
    seq=(c(1:3,1:4)),group=c(rep(1,3),rep(2,4)))

看起来是这样的:

> demo
  th  hs seq group
1  0 220   1     1
2 24 220   2     1
3 26 220   3     1
4  0 240   1     2
5  1 240   2     2
6  2 240   3     2
7  4 240   4     2

需要一个基于 、 和 列的向量,hsseqthhs列到列的总和,并将列seq乘以.thgroup

demo[1,"an"]<-    demo[1,"hs"]^demo[1,"seq"] * demo[1,"th"]
demo[2,"an"]<-sum(demo[1,"hs"]^demo[1,"seq"] * demo[1,"th"],
                                     demo[2,"hs"]^demo[2,"seq"] * demo[2,"th"] )
demo[3,"an"]<-sum(demo[1,"hs"]^demo[1,"seq"] * demo[1,"th"],
                                     demo[2,"hs"]^demo[2,"seq"] * demo[2,"th"],
                                        demo[3,"hs"]^demo[3,"seq"] * demo[3,"th"])

demo[6,"an"]<-sum(demo[4,"hs"]^demo[4,"seq"] * demo[4,"th"],
                                     demo[5,"hs"]^demo[5,"seq"] * demo[5,"th"],
                                        demo[6,"hs"]^demo[6,"seq"] * demo[6,"th"])

这是新列 ( an) 的样子

> demo
  th  hs seq group        an
1  0 220   1     1         0
2 24 220   2     1   1161600
3 26 220   3     1 278009600
4  0 240   1     2        NA
5  1 240   2     2        NA
6  2 240   3     2  27705600
7  4 240   4     2        NA

忽略此 MRE 中的 NA,这些也需要填写。

标签: r

解决方案


图书馆

 library(tidyverse)

样本数据

df <-
   read.csv(
      text = 
 "th hs seq group
0 220 1 1
24 220 2 1
26 220 3 1
0 240 1 2
1 240 2 2
2 240 3 2
4 240 4 2",
sep = " ",header = T
 )

代码

df %>% 
   #Grouping by group
   group_by(group) %>%
   #Applying a cumulative sum of the formula, by group
   mutate(an = cumsum(hs^seq*th))

输出

     th    hs   seq group          an
  <int> <int> <int> <int>       <dbl>
1     0   220     1     1           0
2    24   220     2     1     1161600
3    26   220     3     1   278009600
4     0   240     1     2           0
5     1   240     2     2       57600
6     2   240     3     2    27705600
7     4   240     4     2 13298745600

推荐阅读