我如何创建前几天的总和?

时间:2015-04-20 19:42:07

标签: r

我有这个df与列t。我想创建列t-1和t-2,其中t-1给出两天的总和,t-2给出三天的总和。

  year      t  t-1 t-2
19620101    1   NA  NA
19630102    2   3   NA
19640103    3   5   6
19650104    4   7   9
19650104    5   9   12
19650104    6   11  15

我该怎么做?

额外问题:

我可以在提到acc = 3的情况下自动执行此操作,代码会创建两个名称为(t-1),(t-2)或t1,t2等的列吗?因为我的积累变化很大,所以拥有一个自动解决方案对我有很大帮助。 !谢谢'

预期输出#2

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

1 个答案:

答案 0 :(得分:5)

您似乎已经在使用data.table,因此您可以轻松地将其与zoo::rollsum结合使用,同时设置您想要的任何索引。例如:

library(zoo)
library(data.table)#v1.9.5+
indx <- 2:5 
setDT(df1)[, paste0("t", indx - 1L) := 
             lapply(indx, function(x) rollsum(t, x,
                             na.pad = TRUE, align='right'))]
df1
#        year t t1 t2 t3 t4
# 1: 19620101 1 NA NA NA NA
# 2: 19630102 2  3 NA NA NA
# 3: 19640103 3  5  6 NA NA
# 4: 19650104 4  7  9 10 NA
# 5: 19650104 5  9 12 14 15
# 6: 19650104 6 11 15 18 20

base R/zoo

df1[paste0('t', indx - 1L)] <- lapply(indx, function(x) rollsum(df1$t,
                                   x, na.pad= TRUE, align='right'))
df1
#       year t t1 t2 t3 t4
# 1 19620101 1 NA NA NA NA
# 2 19630102 2  3 NA NA NA
# 3 19640103 3  5  6 NA NA
# 4 19650104 4  7  9 10 NA
# 5 19650104 5  9 12 14 15
# 6 19650104 6 11 15 18 20

或仅使用base R个功能

 df1[paste0('t', indx - 1L)] <-  lapply(indx, function(x) 
                     as.vector(stats::filter(df1$t, rep(1,x), sides=1)))

更新

根据新输出,我们可以使用data.table的devel版本,shift的{​​{1}}选项typelead。默认值为lag

lag

数据

indx <- 2:3
setDT(df1)[, paste0('t', indx - 1L) := lapply(indx, function(x) 
         shift(rollsum(t,x, na.pad=TRUE, align='right')))]
#      year t t1 t2
#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