3

ベクトル化された関数が for ループより優れている理由がわかりました。

しかし、ベクトル化された関数型プログラミングのソリューションが見えない問題がいくつかあります。その 1 つは、月次データを合計して四半期データを取得することです。このコードを置き換える提案...

month <- 1:100
A422072L <- c(rep(NA, 4), rnorm(96, 100, 5) ) + 2 * month
A422070J <- c(NA, NA, rnorm(96, 100, 5), NA, NA) + 2 * month
Au.approvals <- data.frame(month=month, A422072L=A422072L, A422070J=A422070J)

Au.approvals$trend.sum.A422072L.qtr <- NA
Au.approvals$sa.sum.A422070J.qtr <- NA
for(i in seq_len(nrow(Au.approvals)))
{
    if(i < 3) next
    if(all(!is.na(Au.approvals$A422072L[(i-2):i])))
        Au.approvals$trend.sum.A422072L.qtr[i] <- sum(Au.approvals$A422072L[(i-2):i])
    if(all(!is.na(Au.approvals$A422070J[(i-2):i])))
        Au.approvals$sa.sum.A422070J.qtr[i]    <- sum(Au.approvals$A422070J[(i-2):i])
}

print(Au.approvals)

これで、例として実行するのに十分なデータが得られました。

4

2 に答える 2

4

偽の時系列をいくつか作成しましょう。

time_dat = data.frame(t = 1:100, value = runif(100))

ローリング サムを取得するにrollapplyは、zoo パッケージを参照してください。

require(zoo)
time_dat = transform(time_dat, 
                     roll_value = rollapply(value, 10, sum, fill = TRUE))

ここでは、粗い解像度 (四半期ごと) は、細かい解像度よりも 10 倍粗いと仮定します。


非ローリング平均に対する元の回答:

plyrパッケージの関数を使用するのが好きですがave、 、aggregate、およびdata.tableも良いオプションです。大規模なデータセットの場合、data.table非常に高速です。plyrしかし、いくつかの魔法に戻るには:

最初に、より大まかな時間頻度を指定する追加の列を作成します。つまり、どの四半期に観測が行われるかを指定します。

time_dat[["coarse_t"]] = rep(1:10, each = 10)
> head(time_dat)
  t     value coarse_t
1 1 0.9045097        1
2 2 0.4174182        1
3 3 0.5638139        1
4 4 0.8228698        1
5 5 0.7059027        1
6 6 0.5285386        1

time_datこれで、より粗い時間頻度で集計できます。

time_dat_coarse = ddply(time_dat, .(coarse_t), summarise, sum_value = sum(value))
> time_dat_coarse
   coarse_t sum_value
1         1  6.097348
2         2  4.834720
3         3  3.988809
4         4  4.170656
5         5  4.538269
6         6  6.198716
7         7  4.399282
8         8  5.507384
9         9  6.089072
10       10  4.663287

于 2012-10-18T08:02:36.573 に答える
1

ポールの答えは素晴らしかったが、私は chron パッケージには日付/時刻分類のための多くの優れた操作があり、集計のために plyr と組み合わせることができることを付け加えたかった

library("chron") 
# chron uses chron-specific object representation. 
# If a different representation is needed, a conversion is necessary
# eg. if a$date is a chron date object, I would us as.POSIXct(a$date) to get a POSIXct representation

# create chron date objects and values
a<-data.frame(date=as.chron(Sys.Date() + 1:1000), value = 1:100*runif(100,0,1))

# cuts dates into 15 intervals
a$interval1<-cut(a$date,15)
# cuts dates into 10 number of intervals using a label you define
a$interval2<-cut(a$date,10,paste("group",1:10))
# cuts dates into weeks
a$weeks<-cut(a$date,"weeks",start.on.monday=FALSE)
# cuts dates into months
a$months<-cut(a$date,"months")
# cuts dates into years
a$years<-cut(a$date,"years")
# classifies day based on day of week
a$day_of_week<-day.of.week(a$date)

# creating a chron time object
b<-data.frame(day_time=as.chron(Sys.time()+1:1000*100), value = 1:100*runif(100,0,1))
# cuts times into days - note: uses first time period as the start
b$day<-cut(b$day_time,"days")
# truncates time to 5 minute interval
b$min_5<-trunc(b$day_time, "00:05:00")
# truncates time to 1 hour intervals
b$hour1<-trunc(b$day_time, "01:00:00")
# truncates datetime to 1 hour and 2 second intervals
b$days_3<-trunc(b$day_time, "01:00:02")

時間の集計がはるかに簡単になるため、私は chron をよく使用します。

さらに素晴らしい点として、zoo および xts パッケージにはさらに多くの機能があり、1 日レベルの詳細を超えたさまざまな集計に最適です。ドキュメントは膨大で、必要なものを見つけるのは難しいかもしれませんが、必要なものはほとんどすべて揃っています。いくつかのハイライト:

library("zoo")
library("xts")
?rollapply
?rollsum
?rollmean
?rollmedian
?rollmax
?yearmon
?yearqtr
?apply.daily
?apply.weekly
?apply.monthly
?apply.quarterly
?apply.yearly
?to.minutes
?to.minutes3
?to.minutes5
?to.minutes10
?to.minutes15
?to.minutes30
?to.hourly
?to.daily
?to.weekly
?to.monthly
?to.quarterly
?to.yearly
?to.period
于 2012-10-19T18:53:16.100 に答える