7

この質問は、パンダがリサンプリングと呼ぶ R の期間ごとの集計について尋ねます。最も有用な答えは、XTS パッケージを使用して特定の期間でグループ化し、sum() や mean() などの関数を適用します。

コメントの 1 つは、lubridate に似たようなものがあることを示唆していましたが、詳しくは説明しませんでした。誰かが潤滑剤を使用して慣用的な例を提供できますか? 私は潤滑剤のビネットを数回読んで、潤滑剤とプライヤーの組み合わせを想像できますが、見逃している簡単な方法がないことを確認したいと思います.

例をより現実的なものにするために、このデータセットから北向きに移動する自転車の 1 日あたりの合計が必要だとします。

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
4

4 に答える 4

8

なぜこれに潤滑剤を使用するのかわかりません。xtsよりも素晴らしいものを探しているだけなら、これを試すことができます

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

基本的には、split日付を指定してから関数を適用するだけです。


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

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

しかし、それはベースR関数のラッパーを使用しているだけであり、OPの場合、ベースR関数が最も簡単だと思いますas.Date(他の回答もlubridateの使用要求を無視したという事実からも明らかです;-))。


OPでリンクされている他の質問への回答でカバーされていないものは. atを分割し、各グループに関数を適用します。関数を使用して、特定のタスクに役立つエンドポイントを見つけることができます。たとえば、xts オブジェクトがある場合、 は各月の最後の行である行番号を示します。 それを利用して xts オブジェクトを分割します --各コンポーネントが異なる月のものである xts オブジェクトのリストを返します。split.xtsperiod.applyxtsendpointsendpointsxendpoints(x, "months")split.xtssplit(x, "months")

主にオブジェクトsplit.xts()を対象としていますが、プレーン タイム ベースのベクトルなど、他のオブジェクトでも機能します。xts オブジェクトを使用したくない場合でも、その利便性または速度 (C で実装) のために使用法を見つけることができます。endpoints()xtsendpoints()

> 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

この問題における lubridate の最適な使い方は、"Date" 文字列を POSIXct オブジェクトに解析することだと思います。つまり、mdy_hmsこの場合の関数です。

「日付」文字列を解析するためにxts使用するソリューションを次に示します。lubridate

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

この特定のタスクのために、非常に高速xtsな最適化されperiod.sumた関数 (Fortran で記述)も備えています。

period.sum(x, endpoints(x, "days"))
于 2013-08-04T18:49:57.500 に答える
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

fread()また、data.table パッケージの (「高速読み取り」) を使用して、CSV を data.table に 1 ステップで読み込むこともできます。唯一の欠点は、日付/時刻を文字列から手動で変換することです。

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")] 
于 2013-08-04T19:18:26.780 に答える
1

これは、リンクされた質問にも追加した、要求された潤滑剤ソリューションです。これらの操作には、 lubridatezoo aggregate()の組み合わせを使用します。

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

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

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

明らかに、最初にデータをzoo()オブジェクトに変換する必要がありますが、これは簡単です。yearmon() または yearqtr()、または分割と適用の両方にカスタム関数を使用することもできます。このメソッドは、 pandasのメソッドと同じくらい構文的に甘いです。

于 2015-09-21T21:25:49.513 に答える