【问题标题】:Is there a way to have a rolling average calculation within a for loop in R?有没有办法在 R 的 for 循环中进行滚动平均值计算?
【发布时间】:2020-11-17 17:20:50
【问题描述】:

我有一个关于 for 循环和滚动平均值的问题,我想要当天加上前 6 天的估计值。目前,我有一个计算每日新人数量的 for 循环。但我想要的是我之前讨论过的滚动平均值。任何帮助,将不胜感激。谢谢!

数据如下:

dataframe = d

               date            place    total
               2020-01-10       A         10
               2020-01-11       A          6
               2020-01-12       A          8
               2020-01-13       A          5
               2020-01-14       A          7
               2020-01-15       A          6
               2020-01-16       A          9
               2020-01-17       A          10
               2020-01-10       B          11
               2020-01-20       B          61
               2020-01-21       B          82
               2020-01-22       B          53
               2020-01-23       B          74
               2020-01-24       B          65
               2020-01-25       B          96
               2020-01-27       B          100

我写的计算每天新增人数的for循环是:

for(x in unique(d$place)) {
  region <- d[d$place == x,]
  n <- nrow(region)
  
  for(i in 1:n-1) {
    region$newpeople[i]<-region$total[i]-region$total[i+1]
  }
  region$newpeople[n]<-region$total[n]
}

然后我将估计值附加到相关的每日日期。我想要类似于过去 7 天的滚动平均值。

date_range <- seq(region$date[1], region$date[n], by = "days")
y <- paste(region$date, collapse = "|")
missing_dates <- date_range[!grepl(y, date_range)]

if (length(missing_dates) != 0) {
  date <- missing_dates
  place <- paste0(region$place[1])
  total<- NA
  newpeople <- NA
  
  df <- data.frame(date, place, total, newpeople)
  region <- rbind(region, df) %>%
    arrange(date)
}

任何帮助将不胜感激!

【问题讨论】:

    标签: r


    【解决方案1】:

    我不确定您是否完全准备好使用 for 循环。

    数据

    d <- read.table(text = "
                   date            place    total
                   2020-01-10       A         10
                   2020-01-11       A          6
                   2020-01-12       A          8
                   2020-01-13       A          5
                   2020-01-14       A          7
                   2020-01-15       A          6
                   2020-01-16       A          9
                   2020-01-17       A          10
                   2020-01-10       B          11
                   2020-01-20       B          61
                   2020-01-21       B          82
                   2020-01-22       B          53
                   2020-01-23       B          74
                   2020-01-24       B          65
                   2020-01-25       B          96
                   2020-01-27       B          100
                   ",
                   header = TRUE)
    

    尝试

    postwebsite 非常有用。所以使用 runner 包中的mean_run() 函数,我们得到

    # install.packages("runner")
    
    d %>%
      group_by(place) %>%
      arrange(date, .by_group = TRUE) %>%
      mutate(
        # Difference between days
        diff = total - lag(total),
        # Rolling average of past seven days
        rolling_7 = runner::mean_run(
          x = total, 
          k = 7,
          idx = as.Date(date)
          )
        )
    

    我不确定这是否是您正在寻找的。例如,在查看 2020 年 1 月 27 日的滚动平均值时,代码识别出您没有 2020 年 1 月 26 日的数据,因此它会跳过它。因此,2020-01-27 的滚动平均值为 78.3 = (82 + 53 + 74 + 65 + 96 + 100) / 6。

    【讨论】:

    • 谢谢。我会试试这个。我做 for 循环的原因是我的数据集实际上非常大,在 for 循环之后,我计算了另一个此处未提供的估计值。但我认为我可以在输出一个 excel 文件并重新读取它之后使用它,然后我可以计算滚动平均值。但如果您对我的 for 循环有任何建议,将不胜感激!
    猜你喜欢
    • 2014-04-09
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2022-01-05
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多