2016-03-24 9 views
1

私は見てきましたが、私の問題によく似た解決策は見つかりませんでした。数年にわたる大規模なデータセットを使用したRの月間平均の計算

私は、1945年から1981年までの毎日の河川流量のデータセット(df1)を持っています。それは非常に大きなデータセットです。

私は、毎月の毎月の平均流量を計算したいと考えています。私はピボットテーブルを使ってExcelでこれを行うことができますが、Rで面倒ではないかと考えています。

私の問題は二重です。まず、日付を実際の日付形式(推奨コードを試しているにもかかわらず)に変換するのに問題があります。第2に、日付を並べ替えると、データセットの毎月の平均を集計する方法がわかりません。私はかなり新しい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") 

を使用していますが、何らかの理由でそれは、日付のいくつかの隙間で、muckingを保ちます:

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が混乱になることなく、日付形式に複数年にまたがる変換することができますどのように、

  • を総括するには?
  • 日付がソートされたら、データが複数年にわたるときに月間平均をどのようにして生成できますか?

多くのおかげで、

I

+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)