问题描述
我有一个数据集,我希望将rollmean应用于平滑数据值。但是,对于我的一些观察,我只有第一个值,因此我将其保留为默认值NA
的地方。为了实现这一点,我正在过滤k> 2以上的数据,因此我可以简单地应用以下代码。对于那些k
- 一些玩具数据
df <- tibble(city = sample(LETTERS[1:11],10,rep=TRUE),deaths = sample(1000:10000,rep=TRUE))
df %>%
dplyr::arrange(desc(city)) %>%
dplyr::group_by(city) %>%
dplyr::mutate(roll = zoo::rollmean(deaths,k = 2,fill = NA,align="right")) %>%
dplyr::ungroup()
# A tibble: 10 x 3
city deaths roll
<chr> <int> <dbl>
1 K 9292 NA
2 K 7339 8316.
3 J 3537 NA
4 J 1207 2372
5 G 4994 NA
6 F 2185 NA
7 F 1408 1796.
8 E 4254 NA
9 D 5269 NA
10 B 5448 NA
解决方法
我们可以使用partial = TRUE
library(dplyr)
df %>%
dplyr::arrange(desc(city)) %>%
dplyr::group_by(city) %>%
dplyr::mutate(roll = zoo::rollmean(deaths,k = 2,fill = NA,align="right",partial = TRUE)) %>%
dplyr::ungroup()
# A tibble: 10 x 3
# city deaths roll
# <chr> <int> <dbl>
# 1 K 2128 NA
# 2 K 1877 2002.
# 3 G 2300 NA
# 4 G 9228 5764
# 5 E 6921 6921 -> single value
# 6 C 9676 9676 -> single value
# 7 B 2798 NA
# 8 B 9920 6359
# 9 A 9521 NA
#10 A 8844 9182.
,
根据您的预期输出,您可以选择以下选项之一。另外,WorkspaceUserId
等于rollmean(...,align = 'right')
。
- 您可以检查组中的行数,并将
rollmeanr
的行数保持为1。请注意,对于行数较大的第一个值,这仍将为death
比1。
NA
- 您可以使用
df %>% dplyr::arrange(desc(city)) %>% dplyr::group_by(city) %>% dplyr::mutate(roll = if(n() == 1) deaths else zoo::rollmeanr(deaths,fill = NA))
获取所有默认值的默认值。这会将每个组中的fill = first(deaths)
替换为该组的第一个值。因此,将最后一行更改为:
NA
- 您可以将
dplyr::mutate(roll = zoo::rollmeanr(deaths,fill = first(deaths)))
与rollaplyr
一起使用。当partial = TRUE
时,其输出与k = 2
相同,但是如果您更改窗口大小,则会看到差异。
(2)