Мне нужно создать сумму следующих 7 дней значений столбца в г. Сумма должна быть сгруппирована по другому столбцу, который имеет строковые значения - PullRequest
0 голосов
/ 10 октября 2018

Мне нужно создать сумму значений следующих 7 дней для столбца в r. Сумма должна быть сгруппирована по другому столбцу со строковыми значениями

Пример

name   value 
a       2    
a       3  
a       3  
b       4  
b       3  
b       2  
b       1  
b       3  

сумма по2 следующих ряда

вывод

sum
5
6
3
7
5
3     
4
3

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Пакет zoo специально разработан для таких задач.

library(zoo)

df1$new <- unlist(tapply(df1$value, factor(df1$name), function(x){ zoo::rollsum(x, 2, align = "left", fill = x[length(x)]) }))

#> df1$new
#[1] 5 6 3 7 5 3 4 3

df1 <- data.frame(stringsAsFactors=FALSE,
                  name = c("a", "a", "a", "b", "b", "b", "b", "b","c","d","d","d"),
                  value = c(2L, 3L, 3L, 4L, 3L, 2L, 1L, 3L, 4L, 1L:3L)
)

windowSize = 3

df1$new <- unlist(
    tapply(df1$value, factor(df1$name),function(x){
        IND <- (length(x)-(windowSize-2)):length(x);IND = IND[IND > 0]
        c(  zoo::rollsum(x, windowSize, align = "left"), rev(cumsum(rev(x[IND])))  )})
    )

Это было немного сложно сделать:

Вот формула вуважение к заданному размеру окна.

0 голосов
/ 10 октября 2018

Вы можете использовать lead() и lag() для ссылки на следующие и предыдущие значения.

Этот код суммирует текущий и следующий, сгруппированные по строковым значениям:

library(dplyr)

df <- data.frame(stringsAsFactors=FALSE,
          V1 = c("a", "a", "a", "b", "b", "b", "b", "b"),
          V2 = c(2L, 3L, 3L, 4L, 3L, 2L, 1L, 3L)
)

df

df %>% 
  group_by(V1) %>% 
  mutate(sum_forward = dplyr::lead(V2) + V2)

И это вывод.NA есть, потому что в последний день нет следующего дня для суммирования.

  V1       V2 sum_forward
  <chr> <int>       <int>
1 a         2           5
2 a         3           6
3 a         3          NA
4 b         4           7
5 b         3           5
6 b         2           3
7 b         1           4
8 b         3          NA
...