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

R 如何创建前几天的总和,但忽略时间t的值?,r,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 这个问题的一个稍微不同的版本如下: 基本上,

我有这个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
这个问题的一个稍微不同的版本如下:


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

我不太明白你所说的“我不想在累加中使用时间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

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

library(zoo)

roll <- function(t, k) rollapplyr(t, list(-seq(k)), sum, fill = NA)
transform(df, t2 = roll(t, 2), t3 = roll(t, 3))
注意:我们将其用作
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")

df嗨,这正在工作。我实际上知道如何“手动”完成。但是我想要一个类似于这个答案的自动化解决方案:我想给它一个值,它根据这个值创建n列。通过不使用t累加,我的意思是第一列应该添加前两天的数据,而不是像我的链接答案中给出的今天+昨天。如果我需要进一步澄清,请告诉我。用自编函数解决这个问题怎么样?嗨,有可能实现自动化吗?在这里,我可以提到一个值,它会自动创建许多列:
do.call(cbind,lapply(2:k,roll,t=df$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 <-
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")