R 带窗长的滚筒长度>;1:填充缺少的值

R 带窗长的滚筒长度>;1:填充缺少的值,r,dplyr,zoo,R,Dplyr,Zoo,我的数据框看起来像下面的前两列 df %>% group_by(ID) %>% mutate(SUM=rollsumr(VAL, k=min(3, row_number())) %>% ungroup() 我想添加第三列,等于ID组对VAL的最后三个观察值之和 使用以下命令,我获得了以下输出: df %>% group_by(ID) %>% mutate(SUM=rollsumr(VAL, k=3)) %>% ungrou

我的数据框看起来像下面的前两列

df %>% 
  group_by(ID) %>% 
  mutate(SUM=rollsumr(VAL, k=min(3, row_number())) %>% 
  ungroup()
我想添加第三列,等于ID组对VAL的最后三个观察值之和

使用以下命令,我获得了以下输出:

df %>% 
  group_by(ID) %>% 
  mutate(SUM=rollsumr(VAL, k=3)) %>% 
  ungroup()

ID VAL  SUM
1  2    NA
1  1    NA
1  3    6
1  4    8
...
我现在希望能够填充前两行组单元格的NAs结果

ID VAL  SUM
1  2    2
1  1    3
1  3    6
1  4    8
...
我该怎么做

我试着做了以下几件事

df %>% 
  group_by(ID) %>% 
  mutate(SUM=rollsumr(VAL, k=min(3, row_number())) %>% 
  ungroup()


但两者都给了我同样的错误,因为我有一组大小不是一个直接的答案,但一种方法是将
NA
s的值替换为
cumsum
of
VAL

library(dplyr)
library(zoo)

df %>% 
  group_by(ID) %>% 
  mutate(SUM = rollsumr(VAL, k=3, fill = NA), 
         SUM = ifelse(is.na(SUM), cumsum(VAL), SUM))

#     ID   VAL   SUM
#  <int> <int> <int>
#1     1     2     2
#2     1     1     3
#3     1     3     6
#4     1     4     8

或者,您可以使用同一软件包中的
rollapply()

df %>% 
 group_by(ID) %>% 
 mutate(SUM = rollapply(VAL, width = 3, FUN = sum, partial = TRUE, align = "right"))

     ID   VAL   SUM
  <int> <int> <int>
1     1     2     2
2     1     1     3
3     1     3     6
4     1     4     8
df%>%
分组依据(ID)%>%
mutate(SUM=rollappy(VAL,width=3,FUN=SUM,partial=TRUE,align=“right”))
ID VAL SUM
1     1     2     2
2     1     1     3
3     1     3     6
4     1     4     8

由于参数
partial=TRUE
,也会对长度为3的所需窗口下方的行求和

rollsumr是来自哪个软件包的?zoo软件包。我编辑了问题的文本以包含我需要的输出。
df %>% 
 group_by(ID) %>% 
 mutate(SUM = rollapply(VAL, width = 3, FUN = sum, partial = TRUE, align = "right"))

     ID   VAL   SUM
  <int> <int> <int>
1     1     2     2
2     1     1     3
3     1     3     6
4     1     4     8