2013-08-04 6 views
6

This questionは、どのパンダがリサンプリングを呼んでいるのかを時間単位で集計しています。最も有用な答えは、XTSパッケージを使用して、sum()やmean()などの関数を適用して、指定された期間でグループ化します。ルブリド中の時間による集約

コメントの1つに、類似のものがあることが示唆されていますが、詳しくは触れていません。誰かがlubridateを使って慣用的な例を提供できますか?私は、潤滑剤のビネットを何度か読んだことがありますが、潤滑剤と潤滑剤の組み合わせを想像することはできますが、私が欠けている簡単な方法がないことを確認したいと思います。

のは、私は、このデータセットから北回り旅自転車の日々の合計をしたいとしましょう、例をよりリアルにするには:

library(lubridate) 
library(reshape2) 

bikecounts <- read.csv(url("http://data.seattle.gov/api/views/65db-xm6k/rows.csv?accessType=DOWNLOAD"), header=TRUE, stringsAsFactors=FALSE) 
names(bikecounts) <- c("Date", "Northbound", "Southbound") 

データは次のようになります。私は知りません

> head(bikecounts) 
        Date Northbound Southbound 
1 10/02/2012 12:00:00 AM   0   0 
2 10/02/2012 01:00:00 AM   0   0 
3 10/02/2012 02:00:00 AM   0   0 
4 10/02/2012 03:00:00 AM   0   0 
5 10/02/2012 04:00:00 AM   0   0 
6 10/02/2012 05:00:00 AM   0   0 

答えて

6

なぜあなたはこのためにlubridateを使うのですか?あなただけXTS未満素晴らしい何かを探しているなら、あなたはちょうどその機能を適用し、日によってsplitに必要な、基本的にこの

tapply(bikecounts$Northbound, as.Date(bikecounts$Date, format="%m/%d/%Y"), sum) 

試みることができます。


lubridateは、分割適用問題のグループ化係数を作成するために使用できます。したがって、たとえば、あなたが各月の合計をしたい場合(年を無視して)

tapply(bikecounts$Northbound, month(mdy_hms(bikecounts$Date)), sum) 

しかし、それだけで基本R機能のラッパーを使用していて、OPの場合には、私は基本R機能を考えるas.Date最も簡単です(他のAnswersもあなたのlubridateの使用要求を無視していました;-))。


OPににリンクされている他のQuestionAnswerで覆われていない何かがsplit.xtsです。 period.applyxtsendpointsに分割し、各グループに機能を適用します。 endpoints機能を使用すると、特定のタスクに役立つエンドポイントを見つけることができます。たとえば、xtsオブジェクトがxの場合、endpoints(x, "months")は、各月の最後の行である行番号を返します。 split.xtsはそれを利用してxtsオブジェクトを分割します。split(x, "months")は、各コンポーネントが別の月のxtsオブジェクトのリストを返します。およびendpoints()は、主にxtsオブジェクトを対象としていますが、プレーン時間ベースのベクターを含むいくつかの他のオブジェクトでも動作します。あなたはXTSのオブジェクトを使用したくない場合でも、あなたはまだ、その利便性や(Cで実装)、そのスピード

> split.xts(as.Date("1970-01-01") + 1:10, "weeks") 
[[1]] 
[1] "1970-01-02" "1970-01-03" "1970-01-04" 

[[2]] 
[1] "1970-01-05" "1970-01-06" "1970-01-07" "1970-01-08" "1970-01-09" 
[6] "1970-01-10" "1970-01-11" 

> endpoints(as.Date("1970-01-01") + 1:10, "weeks") 
[1] 0 3 10 

endpoints()の用途を見出すことが、私はこの問題でlubridateの最高の使用が解析するためだと思いますPOSIXctオブジェクトへの "Date"文字列。この場合はmdy_hmsの機能になります。

を使用して "日付"文字列を解析するxtsソリューションです。この特定のタスクのために

x <- xts(bikecounts[, -1], mdy_hms(bikecounts$Date)) 
period.apply(x, endpoints(x, "days"), sum) 
apply.daily(x, sum) # identical to above 

xtsもここで非常に高速です(Fortranで書かれた)最適化period.sum機能

period.sum(x, endpoints(x, "days")) 
+0

これも同様に便利です。コンセンサスが「潤滑剤を使用せず、代わりにXTSを使用する」場合は、この回答を受け入れることを嬉しく思います。それは、私は "lubridateを使用"の多くを聞くので、私はちょっと大騒ぎがすべてであることを学びたいと思う! – Peter

+1

私は@GSeeに同意する傾向があります。 'lubridate'関数を使って' ddply'可能なグループ化変数を達成する最も簡単な 'lubridate'方法は' bikecounts $ date2 < - mdy_hms(x = bikecounts $ Date) 'です; 'bikecounts $ date3 < - round_date(x = bc $ date2、unit =" day ")'。 – Henrik

+0

皆様からの素晴らしい回答です。私の開始前提を訂正する2)ベースを提供するRの例3)潤滑剤のバージョンをどのように見せるかを示し、4)xtsの利点を説明する。 – Peter

2

はcsvファイルをインポートした後data.table を使用してオプションでいます

library(data.table) 

# convert the data.frame to data.table 
bikecounts <- data.table(bikecounts) 

# Calculate 
bikecounts[, list(NB=sum(Northbound), SB=sum(Southbound)), by=as.Date(Date, format="%m/%d/%Y")] 

     as.Date NB SB 
    1: 2012-10-02 1165 773 
    2: 2012-10-03 1761 1760 
    3: 2012-10-04 1767 1708 
    4: 2012-10-05 1590 1558 
    5: 2012-10-06 926 1080 
---      
299: 2013-07-27 1212 1289 
300: 2013-07-28 902 1078 
301: 2013-07-29 2040 2048 
302: 2013-07-30 2314 2226 
303: 2013-07-31 2008 2076 

注:data.tableパッケージから( "高速読み込み")を実行して、CSVを1ステップでdata.tableに読み込みます。 文字列から日付/時刻を手動で変換するだけです。 plyrパッケージからddplyを使用して

eg: 
bikecounts <- fread("http://data.seattle.gov/api/views/65db-xm6k/rows.csv?accessType=DOWNLOAD", header=TRUE, stringsAsFactors=FALSE) 
setnames(bikecounts, c("Date", "Northbound", "Southbound")) 
bikecounts[, Date := as.POSIXct(D, format="%m/%d/%Y %I:%M:%S %p")] 
+1

この回答は、本当に速い集約が必要な場所でも非常に良いです。ベンチマークをせずに、私はこのアプローチが最速であると思います。 – Peter

+0

data.tableをlubridateまたはfasttimeと混合するのはどうですか? – skan

2

library(plyr) 
bikecounts$Date<-with(bikecounts,as.Date(Date, format = "%m/%d/%Y")) 
x<-ddply(bikecounts,.(Date),summarise, sumnorth=sum(Northbound),sumsouth=sum(Southbound)) 


> head(x) 
     Date sumnorth sumsouth 
1 2012-10-02  1165  773 
2 2012-10-03  1761  1760 
3 2012-10-04  1767  1708 
4 2012-10-05  1590  1558 
5 2012-10-06  926  1080 
6 2012-10-07  951  1191 


> tail(x) 
      Date sumnorth sumsouth 
298 2013-07-26  1964  1999 
299 2013-07-27  1212  1289 
300 2013-07-28  902  1078 
301 2013-07-29  2040  2048 
302 2013-07-30  2314  2226 
303 2013-07-31  2008  2076 
1

をここで私もリンクされ、質問に追加要求lubridateソリューションです。

ts.month.sum <- aggregate(zoo.ts, month, sum) 

ts.daily.mean <- aggregate(zoo.ts, day, mean) 

ts.mins.mean <- aggregate(zoo.ts, minutes, mean) 

もちろん、あなたが最初に十分に簡単である動物園()オブジェクトのために、データを変換する必要があります。それは、これらの操作のためのlubridate動物園集計()の組み合わせを使用しています。また、yearmon()またはyearqtr()、またはのカスタム関数のカスタム関数を分割して適用することもできます。この方法は、パンダと構文的に甘いです。