我有这个df与列t。我想创建列t2和t3,其中
这是数据框
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
这个问题略有不同的版本:How can I create sum of previous days?
基本上我不想在累积时使用时间t的值。
答案 0 :(得分:1)
我不太明白你的意思是“我不想在积累时使用时间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
答案 1 :(得分:1)
根据zoo roll
定义rollapplyr
函数并使用它。请注意,rollapplyr
width
参数list(-seq(k))
表示使用指示的偏移量。例如,如果k = 2则等于list(c(-1, -2))
,这意味着使用先前的值1和。
library(zoo)
roll <- function(t, k) rollapplyr(t, list(-seq(k)), sum, fill = NA)
transform(df, t2 = roll(t, 2), t3 = roll(t, 3))
另一种选择是:
roll <- function(t, k) rollsumr(t, k+1, fill = NA) - 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
:
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")