窗口长度> 1的rollsumr:填充缺失值

时间:2019-01-28 08:01:13

标签: r dplyr zoo

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

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

  

评估错误:至少需要两个非NA值进行插值。

我该怎么办?

2 个答案:

答案 0 :(得分:2)

或者,您可以在同一软件包中使用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,还对所需长度为3的窗口下方的行进行求和。

答案 1 :(得分:1)

不是直接的答案,而是一种方法是用NA的{​​{1}}替换cumsum的值

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 进行检查

row_number()