Сумма 1:n по группам

#r

Вопрос:

Есть: Набор данных Мне нужно суммировать 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
 

Нужен вектор, который основан на столбцах hs , seq , и th , но является суммированием hs столбца, поднятого в seq столбец, и умножением th столбцов до этой строки в пределах group .

 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
 

Игнорируйте NA в этом MRE, их тоже нужно заполнить.

Ответ №1:

Библиотеки

  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
 

Комментарии:

1. Я думаю, что TO хочет, чтобы это было сгруппировано по группам, поэтому вы, возможно, захотите добавить group_by

Ответ №2:

Мы можем использовать data.table

 library(data.table)
setDT(df)[, an := cumsum(hs^seq^th), group]