【问题标题】:How to calculate average values large datasets如何计算大型数据集的平均值
【发布时间】:2024-01-16 09:13:01
【问题描述】:

我正在使用一个数据集,该数据集每小时 24 小时读取一次温度,持续 100 多年。我想获得每天的平均温度以减少数据集的大小。标题如下所示:

     YR MO DA HR MN TEMP
  1943  6 19 10  0   73
  1943  6 19 11  0   72
  1943  6 19 12  0   76
  1943  6 19 13  0   78
  1943  6 19 14  0   81
  1943  6 19 15  0   85
  1943  6 19 16  0   85
  1943  6 19 17  0   86
  1943  6 19 18  0   86
  1943  6 19 19  0   87

等 600,000 多个数据点。

如何运行嵌套函数来计算日平均温度,以便保留 YR、MO、DA、TEMP? 一旦我有了这个,我希望能够查看长期平均值并计算出 30 年来 1 月份的平均温度。我该怎么做?

【问题讨论】:

  • 两个警告:注意删除不完整的日期(或插入它们),并且所有小时的简单平均值不是人们通常认为的平均温度 - 有一些愚蠢的标准,比如从 9:00 开始的温度,重量为 0.4,再加上从 13:00 开始的温度,重量为 0.6。
  • 感谢您的提醒!现在这只是一个课程项目,不会用于发布。不过,我会在未来对此进行研究。

标签: r time-series average plyr


【解决方案1】:

您可以一步完成:

 meanTbl <- with(datfrm, tapply(TEMP, ISOdate(YR, MO, DA), mean) )

这将为您提供日期时间格式的索引以及值。如果您只想将 Date 作为字符而没有尾随时间:

meanTbl <- with(dat, tapply(TEMP, as.Date(ISOdate(YR, MO, DA)), mean) )

月平均值可以通过:

 monMeans <- with(meanTbl, tapply(TEMP, MO, mean))

【讨论】:

  • 谢谢!我确实使用了这个,尽管我决定使用下面评论的 plyr 包
【解决方案2】:

您可以使用aggregate

# daily means
aggregate(TEMP ~ YR + MO + DA, FUN=mean, data=data) 

# monthly means 
aggregate(TEMP ~ YR + MO, FUN=mean, data=data)

# yearly means
aggregate(TEMP ~ YR, FUN=mean, data=data)

# monthly means independent of year
aggregate(TEMP ~ MO, FUN=mean, data=data)

【讨论】:

  • 谢谢!我确实使用了这个,尽管我决定使用下面评论的 plyr 包
【解决方案3】:

您的第一个问题可以使用plyr 包来解决:

library(plyr)
daily_mean = ddply(df, .(YR, MO, DA), summarise, mean_temp = mean(TEMP))

类比上述解决方案,获取月度意味着:

monthly_mean = ddply(df, .(YR, MO), summarise, mean_temp = mean(temp))

或获取整个数据集(30 年,即气候平均值)的月平均值,而不是每年:

monthly_mean_normals = ddply(df, .(MO), summarise, mean_temp = mean(temp))

【讨论】:

  • 您好,谢谢!我确实用它来减少我的数据,它太棒了。当我计算monthly_mean_normals时,结果都回来了“NA”我在这里错过了什么吗?如何计算 1950-1980 年的月(或日)均值?
  • 阅读mean的文档,特别是na.rm