我有一个带t列的df,我想要创建列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发布于 2015-04-20 19:47:01
似乎您已经使用了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和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数据
df1 <- 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")https://stackoverflow.com/questions/29756924
复制相似问题