我的数据框看起来像下面的前两列
我想添加第三列,等于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值进行插值。
我该怎么办?
答案 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()