【问题标题】:Error in finding average/mean of columns month wise in R在 R 中逐月查找列的平均值/平均值时出错
【发布时间】:2014-10-08 17:02:38
【问题描述】:

我有这个数据框,我想用每个月的平均值替换/形成新的数据集。

    month    value
  Oct. 2012  52.7
  Nov. 2012  53.0
  Dec. 2012  54.1
  Jan. 2013  53.1
  Feb. 2013  53.6
  Mar. 2013  53.8
  Apr. 2013  54.1
  May. 2013  54.6
  Jun. 2013  54.8
  Jul. 2013  54.3
  Aug. 2013  54.5
  Sep. 2013  54.5
  Oct. 2013  54.0
  Nov. 2013  54.2
  Dec. 2013  54.8
  Oct. 2012  37.2
  Nov. 2012  37.4
  Dec. 2012  38.4
      .        .
      .        .

如您所见,对于每年的每个月,如Oct. 2012Nov. 2012 等都有多个值。现在要获取数据框中每个单独月份的平均值/平均值,我执行了此命令

data_mean <- data_frame %.% group_by(month) %.% summarize(value = mean(value))

它确实正确地找到了每个月的平均值但在输出中它会按字母顺序重新排序月份。所以在输出中Oct. 2012 出现在Apr. 2013 之后,依此类推,而它应该在之前。我想计算平均月份,但不想按字母顺序重新排序输出。如何修改上面的命令或者有一些更短的方法。

【问题讨论】:

    标签: r dataframe dplyr mean


    【解决方案1】:

    month 列更改为具有适当排序级别的因子:

    data_frame %>% 
      mutate(month = factor(substr(month, 1, 3), month.abb)) %>%
      group_by(month) %>% 
      summarize(value = mean(value))
    

    给予:

       month    value
    1    Jan 53.10000
    2    Feb 53.60000
    3    Mar 53.80000
    4    Apr 54.10000
    5    May 54.60000
    6    Jun 54.80000
    7    Jul 54.30000
    8    Aug 54.50000
    9    Sep 54.50000
    10   Oct 47.96667
    11   Nov 48.20000
    12   Dec 49.10000
    

    更新

    问题要求按月提供数据;然而,在评论中,这被修改为按年/月要求。在这种情况下,请使用 zoo 将其转换为 yearmon,然后再转换为数字(因为 dplyr 分组似乎不支持 yearmon),最后还可以选择返回 yearmon:

    library(zoo)
    
    data_frame %>% 
      mutate(month = as.numeric(as.yearmon(as.character(month), "%b. %Y"))) %>%
      group_by(month) %>% 
      summarize(value = mean(value)) %>%
      mutate(month = as.yearmon(month))
    

    【讨论】:

    • 但是这会给我OctNov 但不是Oct 2012, Nov 2012。我想让Oct 2012Oct 2013 分开,每个月都一样
    【解决方案2】:

    如果您打算做很多这样的事情,您可以考虑使用 zoo 包将其视为时间序列。

    library(zoo)
    df$yrmon <- as.yearmon(df$month,"%b. %Y")
    aggregate(value~yrmon,df,mean)
    ##       yrmon value
    ## 1  Oct 2012 44.95
    ## 2  Nov 2012 45.20
    ## 3  Dec 2012 46.25
    ## 4  Jan 2013 53.10
    ## 5  Feb 2013 53.60
    ## 6  Mar 2013 53.80
    ## 7  Apr 2013 54.10
    ## 8  May 2013 54.60
    ## 9  Jun 2013 54.80
    ## 10 Jul 2013 54.30
    ## 11 Aug 2013 54.50
    ## 12 Sep 2013 54.50
    ## 13 Oct 2013 54.00
    ## 14 Nov 2013 54.20
    ## 15 Dec 2013 54.80
    

    【讨论】:

    • 去动物园:read.zoo(data_frame, FUN = as.yearmon, format = "%b. %Y", aggregate = mean)
    【解决方案3】:

    如果您的数据在data.table 中,这是一步:

    library(data.table)               # load library
    DT <- as.data.table(DF)           # convert data.frame to data.table
    DT[,mean(value),by=month]         # compute mean by month
    

    这基本上是在 unique 类型排序中完成的!

    如果你想明确一点,这里还有两个步骤:

    DT[,`:=`(mon = factor(substr(month, 1, 3), month.abb), 
             yr = substr(month,6,9))] # create new columns for month and year
    setkey(DT,yr,mon)                 # set keys, order is important
    DT[,mean(value),by=key(DT)]       # compute mean by key
    

    这将为您提供所需的内容,并且可以更好地扩展大型阵列。 (与data.frame 相比,快了大约 10-50 倍。)

    请注意,data.table 具有类 data.frame,但对于此操作和类似操作要快得多。

    【讨论】:

    • +1 一个小建议是避免设置键并使用 adhoc-by 进行聚合,除非绝对必要。
    【解决方案4】:

    你也可以使用tapply:

    with(ddf, tapply(value, month, mean))
        Apr.     Aug.     Dec.     Feb.     Jan.     Jul.     Jun.     Mar.     May.     Nov.     Oct.     Sep. 
    54.10000 54.50000 49.10000 53.60000 53.10000 54.30000 54.80000 53.80000 54.60000 48.20000 47.96667 54.50000 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2018-03-14
      • 2020-08-10
      • 2021-12-22
      相关资源
      最近更新 更多