应用rollmean,但如果公司的k> 2,则保持单值

问题描述

我有一个数据集,我希望将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')

  1. 您可以检查组中的行数,并将rollmeanr的行数保持为1。请注意,对于行数较大的第一个值,这仍将为death比1。
NA
  1. 您可以使用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
  1. 您可以将dplyr::mutate(roll = zoo::rollmeanr(deaths,fill = first(deaths))) rollaplyr一起使用。当partial = TRUE时,其输出与k = 2相同,但是如果您更改窗口大小,则会看到差异。
(2)