4

私はRでexp(ここにファイル)と呼ばれる大きなデータフレームを使用しています。パフォーマンスの観点から、plyrからidata.frame()関数をチェックアウトすることをお勧めします。しかし、私はそれを間違って使用していると思います。

私の元の呼び出しは遅いですが、機能します:

df.median<-ddply(exp, 
                 .(groupname,starttime,fPhase,fCycle), 
                 numcolwise(median), 
                 na.rm=TRUE)

idata.frameを使用すると、Error: is.data.frame(df) is not TRUE

library(plyr)
df.median<-ddply(idata.frame(exp), 
                 .(groupname,starttime,fPhase,fCycle), 
                 numcolwise(median), 
                 na.rm=TRUE)

だから、多分それは私のデータだと思いました。そこで、baseballデータセットを試しました。このidata.frame例は正常に機能します。dlply(idata.frame(baseball), "id", nrow)ただし、を使用して目的の呼び出しに似たものを試してみるとbaseball、機能しません。

bb.median<-ddply(idata.frame(baseball), 
                 .(id,year,team), 
                 numcolwise(median), 
                 na.rm=TRUE)
>Error: is.data.frame(df) is not TRUE

おそらく私のエラーは、グループ化を指定する方法にありますか?誰かが私の例を機能させる方法を知っていますか?

ETA:

私も試しました:

groupVars <- c("groupname","starttime","fPhase","fCycle")
voi<-c('inadist','smldist','lardist')

i<-idata.frame(exp)
ag.median <- aggregate(i[,voi], i[,groupVars], median)
Error in i[, voi] : object of type 'environment' is not subsettable

これは中央値を取得するためのより高速な方法を使用しますが、別のエラーが発生します。idata.frameの使い方がよくわからないと思います。

4

2 に答える 2

1

「ビッグ」データを使用してパフォーマンスを探している場合、これはに最適のようですdata.table

具体的には、lapply(.SD,FUN).SDcols引数by

セットアップdata.table

library(data.table)
DT <- as.data.table(exp)
iexp <- idata.frame(exp)

どの列がnumeric

numeric_columns <- names(which(unlist(lapply(DT, is.numeric))))



dt.median <- DT[, lapply(.SD, median), by = list(groupname, starttime, fPhase, 
    fCycle), .SDcols = numeric_columns]

いくつかのベンチマーク

library(rbenchmark)
benchmark(data.table = DT[, lapply(.SD, median), by = list(groupname, starttime, 
    fPhase, fCycle), .SDcols = numeric_columns], 
 plyr = ddply(exp, .(groupname, starttime, fPhase, fCycle), numcolwise(median), na.rm = TRUE), 
 idataframe = ddply(exp, .(groupname, starttime, fPhase, fCycle), function(x) data.frame(inadist = median(x$inadist), 
        smldist = median(x$smldist), lardist = median(x$lardist), inadur = median(x$inadur), 
        smldur = median(x$smldur), lardur = median(x$lardur), emptyct = median(x$emptyct), 
        entct = median(x$entct), inact = median(x$inact), smlct = median(x$smlct), 
        larct = median(x$larct), na.rm = TRUE)), 
 aggregate = aggregate(exp[, numeric_columns],
                       exp[, c("groupname", "starttime", "fPhase", "fCycle")], 
              median), 
 replications = 5)

##         test replications elapsed relative user.self 
## 4  aggregate            5    5.42    1.789      5.30   
## 1 data.table            5    3.03    1.000      3.03    
## 3 idataframe            5   11.81    3.898     11.77       
## 2       plyr            5    9.47    3.125      9.45       
于 2012-09-10T03:19:07.890 に答える
0

奇妙な振る舞いですが、ドキュメントでもidata.frameは実験的なものであると書かれています。おそらくバグを見つけました。おそらく、is.data.frame()をテストするddplyの先頭にあるチェックを書き直すことができます。

いずれにせよ、これにより(私のシステムでは)時間が約20%短縮されます。

system.time(df.median<-ddply(exp, .(groupname,starttime,fPhase,fCycle), function(x) data.frame(
inadist=median(x$inadist),
smldist=median(x$smldist),
lardist=median(x$lardist),
inadur=median(x$inadur),
smldur=median(x$smldur),
lardur=median(x$lardur),
emptyct=median(x$emptyct),
entct=median(x$entct),
inact=median(x$inact),
smlct=median(x$smlct),
larct=median(x$larct),
na.rm=TRUE))
) 

シェーンは別の投稿で、スクリプトの結果をキャッシュできるかどうか尋ねました。私はあなたのワークフローのアイデアを本当に知りませんが、これを実行し、結果を毎日/毎時何でも保存するためにクロノを設定するのが最善かもしれません。

于 2010-10-21T07:03:55.897 に答える