2

関数を実行するより高速な方法を見つけようとしています。これは、一定期間内の特定の日ごとの中央値を探しています。forループでSapplyを実行するよりも速い方法はありますか?

for(z in unique(as.factor(df$group))){
all[[z]]<- sapply(period, function(x) median(df[x == df$date & df$group==z, 'y']))
}

サンプルデータ:

date<-as.Date("2011-11-01") + 
runif( 1000, 
       max=as.integer( 
           as.Date( "2012-12-31") - 
               as.Date( "2011-11-01")))
period<-as.Date(min(df$date):max(df$date), origin = "1970-01-01")
df <- data.frame(date=date, y = rnorm(1000), group=factor(rep(letters[1:4], each=250)))
4

2 に答える 2

4

私が正しく理解している場合は、各 内でsplit by groupを計算してください。これが解決策です。mediandatedata.table

編集:問題はdateデータセットの形式にありました。一意の要素の数が間違っていると報告されているようです。POSIXctそのため、フォーマットに合わせて再キャストする必要がありました。

df$date <- as.POSIXct(as.character(df$date), format="%Y-%m-%d")
require(data.table)
dt <- data.table(df)

setkey(dt, "date")
dt.out <- dt[, lapply(letters[1:4], 
          function(x) median(y[group == x])), by = date]

これは、Victor の出力と同じです。

于 2013-01-29T00:40:15.563 に答える
2

ベースR関数を使用したソリューションは次のとおりですtapply

tapply(df$y, df$date, median)

更新します。上記のコメントから判断すると、グループごとに 1 つの列が必要ですか? それもワンライナーです:

tapply(df$y, list(df$date, df$group), median)
于 2013-01-29T01:25:43.997 に答える