使用跨越数年的大型数据集计算R中的月平均值

时间:2016-03-24 16:40:23

标签: r date average

我环顾四周,但没有找到与我的问题相符的解决方案。

我有一个数据集(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组为单位显示,所以我假设问题与&#34;月&#34;有些混淆,但我尝试了几种不同的d / m组合/ Y并且它们都没有工作。

总而言之,

  • 如何在不使R混淆的情况下将跨越多年的数据转换为日期格式?
  • 对日期进行排序后,如果我的数据跨越多年,如何生成月平均值?

非常感谢,

3 个答案:

答案 0 :(得分:2)

我建议使用Lubridate转换日期,然后使用dplyr来操作数据帧。查看您的数据,您的日期似乎是日/月/年(dmy with Lubridate)。

假设您的数据框名为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) )

希望这有帮助。

答案 1 :(得分:1)

考虑在日期转换后使用基本函数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)

答案 2 :(得分:0)

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'