R 如何创建前几天的总和,但忽略时间t的值?
我有这个df和t列。我想创建t2和t3列,其中R 如何创建前几天的总和,但忽略时间t的值?,r,R,我有这个df和t列。我想创建t2和t3列,其中 t2给出了t-2和t-3之和 t3给出了t-2、t-3和t-4等的总和 这是数据帧 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 这个问题的一个稍微不同的版本如下: 基本上,
- t2给出了t-2和t-3之和
- t3给出了t-2、t-3和t-4等的总和
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
这个问题的一个稍微不同的版本如下:
基本上,我不想在累加中使用时间t的值。我不太明白你所说的“我不想在累加中使用时间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
根据zoo的
rollappyr
定义一个roll
函数并使用它。请注意,rollappyr
width
参数list(-seq(k))
表示使用指示的偏移量。例如,如果k=2,那么它等于list(c(-1,-2))
,这意味着使用前面的值1和2
library(zoo)
roll <- function(t, k) rollapplyr(t, list(-seq(k)), sum, fill = NA)
transform(df, t2 = roll(t, 2), t3 = roll(t, 3))
注意:我们将其用作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")
df嗨,这正在工作。我实际上知道如何“手动”完成。但是我想要一个类似于这个答案的自动化解决方案:我想给它一个值,它根据这个值创建n列。通过不使用t累加,我的意思是第一列应该添加前两天的数据,而不是像我的链接答案中给出的今天+昨天。如果我需要进一步澄清,请告诉我。用自编函数解决这个问题怎么样?嗨,有可能实现自动化吗?在这里,我可以提到一个值,它会自动创建许多列:do.call(cbind,lapply(2:k,roll,t=df$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 <-
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")