1

次のようなデータフレームがあります。

Date     Process Duration
1/1/2012 xnit     10
1/1/2012 xnit     15
1/1/2012 xnit     20
1/2/2012 telnet   80
1/2/2012 telnet   50
1/2/2012 telnet   40
8/1/2012 ftp      3
8/1/2012 ftp      11
8/1/2012 ftp     12

x<-data.table(x) に変換した後:

次のように、各ジョブの平均を計算できます。

x<-x[, mean := mean(Duration), by = Process]

特定の日付の期間を平均と比較するのが好きです。私はこれを試しました:

x<-x[, Aug1 := subset(x, Date==as.Date(c("2012-08-01")))$Duration, by = Process]

この値を取得したら、Aug1 列を各プロセスの平均と比較して外れ値を調べます。ただし、このコマンドは完了するまでに非常に長い時間がかかります。これを行うより良い方法はありますか?

4

1 に答える 1

2

これは x への参照による代入であるため、使用時に x に再代入する必要はありません:=(特に、デフォルトで出力されないバージョン 1.8.3 以降)。また、サブセットを使用したり、data.tables を使用したりすることはありません$。これは、すべての data.table の効率を回避するためです。–</p>

このようなことを試してください

 x <- data.table(x)
 # add a column that is the by-process mean
 x[, mean_duration := mean(Duration), by = Process]

 # calculate the difference
 x[, diff_duration := Duration - mean_duration]

 # subset just the 1st of august
 x[Date==as.Date("2012-08-01")]

data.tableが によってキー付けされていれば、この最後のサブセットはより効率的に実行できますDate。現在の形式では、この最終ステップはベクター スキャンですが、1 回のベクター スキャンが非効率的であってはなりません。

data.table の構文と効率をより有効に活用するために、導入ビネットを読むことをお勧めします。

于 2012-10-27T03:25:08.697 に答える