如何创建前几天的总和但忽略时间t的值?

时间:2015-04-24 23:42:21

标签: r

我有这个df与列t。我想创建列t2和t3,其中

  • t2给出t-2和t-3的总和
  • t3给出t-2,t-3和t-4等的总和。

这是数据框

year      t    t2   t3
19620101    1   NA  NA
19630102    2   NA  NA
19640103    3   3   NA
19650104    4   5   6
19650104    5   7   9
19650104    6   9   12

这个问题略有不同的版本:How can I create sum of previous days?

基本上我不想在累积时使用时间t的值。

2 个答案:

答案 0 :(得分:1)

我不太明白你的意思是“我不想在积累时使用时间t的值”。以下怎么样?

library(dplyr)

df %>% mutate(t2 = lag(t,1) + lag(t,2), t3 = lag(t,1) + lag(t,2) + lag(t,3))
     date t t2 t3
1 1-01-20 1 NA NA
2 1-01-21 2 NA NA
3 1-01-22 3  3 NA
4 1-01-23 4  5  6
5 1-01-24 5  7  9
6 1-01-25 6  9 12

答案 1 :(得分:1)

根据zoo roll定义rollapplyr函数并使用它。请注意,rollapplyr width参数list(-seq(k))表示使用指示的偏移量。例如,如果k = 2则等于list(c(-1, -2)),这意味着使用先前的值1和。

library(zoo)

roll <- function(t, k) rollapplyr(t, list(-seq(k)), sum, fill = NA)
transform(df, t2 = roll(t, 2), t3 = roll(t, 3))

另一种选择是:

roll <- function(t, k) rollsumr(t, k+1, fill = NA) - t

,并提供:

      year t t2 t3
1 19620101 1 NA NA
2 19630102 2 NA NA
3 19640103 3  3 NA
4 19650104 4  5  6
5 19650104 5  7  9
6 19650104 6  9 12

注意:我们将其用作df

df <-
structure(list(year = c(19620101L, 19630102L, 19640103L, 19650104L, 
19650104L, 19650104L), t = 1:6), .Names = c("year", "t"), row.names = c(NA, 
-6L), class = "data.frame")