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 以下的行求和。
我的数据框类似于下面的前两列
我想添加第三列,等于 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 以下的行求和。