【问题标题】:Column with mean of 7 subsequent rows in R [duplicate]R中具有7个后续行平均值的列[重复]
【发布时间】:2021-02-04 17:52:38
【问题描述】:

我得到了这个 df:

df <- data.frame(flow = c(1,2,3,4,5,6,7,8,9,10,11))

  flow
1     1
2     2
3     3
4     4
5     5
6     6
7     7
8     8
9     9
10   10
11   11

我想从我们的行中获得一周的平均值,如下所示:

  flow   flow7mean
1     1          4 `(mean of 1,2,3,4,5,6,7)`
2     2          5 (mean of 2,3,4,5,6,7,8)
3     3          6 (mean of 3,4,5,6,7,8,9)
4     4          7 (mean of 4,5,6,7,8,9,10)
5     5          8 (mean of 5,6,7,8,9,10,11)
6     6          NA (it's ok, because there is just 6 flow data)
7     7          NA
8     8          NA
9     9          NA
10   10          NA
11   11          NA

我尝试了一些循环解决方案,但我认为矢量化解决方案更好

【问题讨论】:

    标签: r


    【解决方案1】:

    使用来自zoo 包的rollmean() 试试这个:

    library(zoo)
    #Code
    df$M <- rollmean(df$flow,k = 7,align = 'left',fill=NA)
    

    输出:

    df
       flow  M
    1     1  4
    2     2  5
    3     3  6
    4     4  7
    5     5  8
    6     6 NA
    7     7 NA
    8     8 NA
    9     9 NA
    10   10 NA
    11   11 NA
    

    【讨论】:

    • 我收到了这个错误:在 zoo:rollmean(Q7$Vazao, k = 7, align = "left", fill = NA) :数值表达式有 12245 个元素:只使用第一个(我的第一个值是 NA)
    • @BryanSouza 首先尝试使用您共享的数据。第二次测试这个df$M &lt;- rollmean(df$flow,k = 7,align = 'left',fill=NA,na.rm=T) 并使用str()检查变量的类型
    【解决方案2】:

    我们可以从RcppRoll使用roll_mean

    library(RcppRoll)
    df$flow7mean <- roll_mean(df$flow, 7, fill = NA, align = 'left')
    

    -输出

    df
    #   flow flow7mean
    #1     1         4
    #2     2         5
    #3     3         6
    #4     4         7
    #5     5         8
    #6     6        NA
    #7     7        NA
    #8     8        NA
    #9     9        NA
    #10   10        NA
    #11   11        NA
    

    【讨论】:

      【解决方案3】:

      这是使用embed的基本R选项

      within(df,flow7mean <- `length<-`(rowMeans(embed(flow,7)),length(flow)))
      

      给了

         flow flow7mean
      1     1         4
      2     2         5
      3     3         6
      4     4         7
      5     5         8
      6     6        NA
      7     7        NA
      8     8        NA
      9     9        NA
      10   10        NA
      11   11        NA
      

      【讨论】:

      • embed 的不错选择
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 2020-12-26
      • 2018-08-27
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多