【问题标题】:Rolling average using groupby and varying window length使用 groupby 和不同窗口长度的滚动平均
【发布时间】:2019-09-01 20:10:23
【问题描述】:

我正在尝试根据 R 中的 ID 列和测量时间标签创建列的滚动平均值,但我遇到了很多麻烦。

这是我的数据框的样子:

ID Measurement Value

A    1           10

A    2           12

A    3           14

B    1           10

B    2           12

B   3           14

B   4           10

问题是我的每个 ID 的测量计数从 9 到 76 不等,因此我还没有找到一种解决方案,可以在处理变化的窗口长度时为每个 ID 创建滚动平均值列。

我的目标是这样的数据框:

ID Measurement Value Average

A    1           10 NA

A    2           12 11

A    3           14 12

B    1           10 NA

B    2           12 11

B   3           14  12 

B   4           10 11.5 

【问题讨论】:

    标签: r rolling-computation


    【解决方案1】:

    使用您的数据:

    library(dplyr)
    
    dat %>%
       group_by(Id) %>%
       mutate(Avrg = cumsum(Value)/(1:n()))
    
    # A tibble: 7 x 4
    # Groups:   Id [2]
      Id    Measurement Value  Avrg
      <chr>       <int> <int> <dbl>
    1 A               1    10  10  
    2 A               2    12  11  
    3 A               3    14  12  
    4 B               1    10  10  
    5 B               2    12  11  
    6 B               3    14  12  
    7 B               4    10  11.5
    

    数据:

    structure(list(Id = c("A", "A", "A", "B", "B", "B", "B"), 
                   Measurement = c(1L, 2L, 3L, 1L, 2L, 3L, 4L), 
                   Value = c(10L, 12L, 14L, 10L, 12L, 14L, 10L)
                   ), 
              class = "data.frame", row.names = c(NA, -7L))
    

    附:我很确定 10 的平均值是 10,而不是 NA

    【讨论】:

    • 有价值的答案,面临同样的问题
    【解决方案2】:
    library(dplyr)
    data %>%
    group_by(ID) %>%
    mutate(rolling_mean = cummean(Value))
    

    第一行将是每个组 (ID) 的第一个值的平均值,而不是 NA。

    【讨论】:

      【解决方案3】:

      这不使用任何包。它按 ID 计算累积平均值,除了 Measurement 等于 1 它强制平均值为 NA

      transform(DF, Avg = ave(Value, ID, FUN = cumsum) / 
         ifelse(Measurement == 1, NA, Measurement))
      

      给予:

        ID Measurement Value  Avg
      1  A           1    10   NA
      2  A           2    12 11.0
      3  A           3    14 12.0
      4  B           1    10   NA
      5  B           2    12 11.0
      6  B           3    14 12.0
      7  B           4    10 11.5
      

      注意

      可重现形式的输入DF 是:

      Lines <- "ID Measurement Value
      A    1           10
      A    2           12
      A    3           14
      B    1           10
      B    2           12
      B    3           14
      B    4           10"
      DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE, as.is = TRUE)
      

      【讨论】:

        猜你喜欢
        • 2018-10-03
        • 2020-07-04
        • 2019-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-09
        • 1970-01-01
        相关资源
        最近更新 更多