【问题标题】:Calculating monthly averages in R with a large dataset spanning several years使用跨越数年的大型数据集计算 R 中的月平均值
【发布时间】:2016-03-24 16:40:23
【问题描述】:

我环顾四周,但没有找到与我的问题完全匹配的解决方案。

我有一个数据集 (df1),其中包含从 1945 年到 1981 年的每日河流流量读数 - 所以它是一个非常大的数据集。

我想计算每个月、每年的平均流量。我可以使用数据透视表在 Excel 中执行此操作,但我想知道在 R 中是否会少很多麻烦。

我的问题是双重的。首先,我无法将日期转换为实际的日期格式(尽管尝试了推荐的代码),其次,一旦我对日期进行了排序,我不确定如何汇总数据集中每年的月平均值。我对 R 相当陌生 - 我一直在尽可能地查找教程,但这个特定问题似乎没有一个容易找到的解决方案。

所以,我的数据如下所示:

         X1    X2
1 01/10/1945 0.835
2 02/10/1945 0.835
3 03/10/1945 0.835
4 04/10/1945 0.835
5 05/10/1945 0.835
6 06/10/1945 0.433

日期最初是字符格式,所以我使用代码

df1$X1<-as.Date(df1$X1,"%m/%d/%Y")

尝试将其转换为日期格式,但由于某种原因它一直在搞砸,日期中有几个空白:

8132  1968-05-01  4.163
8133  1968-06-01  4.134
8134  1968-07-01  1.464
8135  1968-08-01  1.682
8136  1968-09-01  1.036
8137  1968-10-01  0.564
8138  1968-11-01  0.575
8139  1968-12-01  0.547
8140        <NA> 10.590
8141        <NA> 16.760
8142        <NA>  3.879
8143        <NA> 11.410

日期以 12 个一组显示,因此我假设问题与“月份”的一些混淆有关,但我尝试了 d/m/Y 的几种不同组合,但没有一个有效。

总结一下,

  • 如何将跨越多年的数据转换为日期格式而不会使 R 变得混乱?
  • 对日期进行排序后,当我的数据跨越多年时,如何生成月度平均值?

非常感谢,

【问题讨论】:

  • 你能显示生成NA的字符串吗?
  • 请注意,as.Date("13/10/1945", "%m/%d/%Y") 将返回 NA。您的日期是否可以根据%d/%m/%Y 格式化?

标签: r date average


【解决方案1】:

我建议使用 Lubridate 来转换您的日期,并使用 dplyr 来操作您的数据框。查看您的数据,您的日期似乎采用日/月/年格式(使用 Lubridate 的 dmy)。

假设您的数据框称为 df :

library(dplyr)
library(lubridate)

df <- mutate(df, X1 = dmy(X1),Year = year(X1), Month = month(X1))
df <- group_by(df, Month, Year)
df <- summarise(df, result = mean(X2) )

您甚至可以链接这些命令以使其更短:

df <- df %>%
  mutate( X1 = dmy(X1),Year = year(X1), Month = month(X1)) %>%
  group_by(Month, Year) %>%
  summarise(result = mean(X2) )

希望这会有所帮助。

【讨论】:

  • 刚刚设法回到办公室试一试。它似乎运行良好;将此代码通过将 csv 转换为我所需要的。非常感谢 - 你让我免去了几个小时摆弄数据透视表的时间!
【解决方案2】:

考虑使用基函数,日期转换后aggregate()

df$X1 <- as.POSIXct(strptime(df$X1, "%m/%d/%Y"))  # US BASED SHORT DATES
df$X1 <- as.POSIXct(strptime(df$X1, "%d/%m/%Y"))  # NON-US BASED SHORT DATES

df$month <- as.numeric(format(df$X1, '%m'))
df$year <- as.numeric(format(df$X1, '%Y'))

aggdf <- aggregate(X2 ~ month + year, df, FUN=mean)

【讨论】:

    【解决方案3】:
    rm(list = ls())
    setwd('path')
    df<-read.csv('path/*.csv')
    flow<-df[,2]
    dt<-ts(flow, frequency=12, start=c(1942,1))
    Month <-  factor(cycle(dt), levels = 1:12, labels = month.abb)
    tmd<-tapply(dt, list(year = floor(time(dt)), month = Month), c)
    write.csv(tmd, 'path/*.csv'
    

    【讨论】:

    • 您能否对您的回答发表评论?
    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2011-06-24
    • 1970-01-01
    • 2021-03-30
    • 2020-10-22
    相关资源
    最近更新 更多