2016-03-24 36 views
1

我环顾四周,但还没有找到与我的问题相当匹配的解决方案。使用跨越数年的大型数据集计算R的月平均值

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

我想计算每年每个月的平均流量。我可以使用Pivot Tables在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") 

要尝试将其转换为日期格式,但由于某种原因,它不断mu漏,在日期中有几个空白:

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数据变得困惑?
  • 对日期进行排序后,如何在我的数据跨越多年后生成月平均值?

非常感谢,

+0

你也可以说是产生'NA'的字符串? – cdeterman

+2

请注意'as.Date(“13/10/1945”,“%m /%d /%Y”)'会返回NA。你的日期可能是根据'%d /%m /%Y'来格式化的吗? – coffeinjunky

回答

2

我建议使用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 %>% 
    mitigate(X1 = dmy(X1),Year = year(X1), Month = month(X1)) %>% 
    group_by(Month, Year) %>% 
    summarise(result = mean(X2)) 

希望这有助于。

+0

只是设法让这个在办公室尝试。这似乎是完美的工作;通过将这些代码转换成我所需要的csv。非常感谢你 - 你让我几个小时摆脱了数据透视表! –

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) 
相关问题