window-length>1 的 rollsumr:填充缺失值

rollsumr with window-length>1: filling missing values

我的数据框类似于下面的前两列

我想添加第三列,等于 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
...

我现在希望能够在前两行中填充组单元格的 NA。

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()

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

但两者都给我同样的错误,因为我有大小 <= 2 的组。

Evaluation error: need at least two non-NA values to interpolate.

我该怎么办?

不是直接的答案,但一种方法是将 NA 的值替换为 VAL

cumsum
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

或者因为您事先知道 window 大小,您也可以使用 row_number() 检查

df %>% 
  group_by(ID) %>% 
  mutate(SUM = rollsumr(VAL, k=3, fill = NA), 
         SUM = ifelse(row_number() < 3, cumsum(VAL), SUM))

或者,您可以使用来自同一包的 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

由于参数 partial = TRUE,还对长度为三的所需 window 以下的行求和。