我有这个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
答案 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}}选项type
或lead
。默认值为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