首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能创造前几天的总和?

我怎样才能创造前几天的总和?
EN

Stack Overflow用户
提问于 2015-04-20 19:42:06
回答 1查看 92关注 0票数 1

我有一个带t列的df,我想要创建列t-1和t-2,其中t-1给出两天的和,t-2给出三天的和。

代码语言:javascript
复制
  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

代码语言:javascript
复制
 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-20 19:47:01

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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函数

代码语言:javascript
复制
 df1[paste0('t', indx - 1L)] <-  lapply(indx, function(x) 
                     as.vector(stats::filter(df1$t, rep(1,x), sides=1)))

更新

根据新的输出,我们可以使用data.table的devel版本,它有shifttype选项,用于leadlag。默认情况是lag

代码语言:javascript
复制
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

数据

代码语言:javascript
复制
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")
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29756924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档