4

(私の標準では)かなり大きなデータセットがあり、レコードのブロックのシーケンス番号を作成したいと思います。plyrパッケージを使用できますが、実行時間が非常に遅くなります。以下のコードは、同等のサイズのデータ​​フレームを複製します。

## simulate an example of the size of a normal data frame
N <- 30000
id <- sample(1:17000, N, replace=T)
term <- as.character(sample(c(9:12), N, replace=T))
date <- sample(seq(as.Date("2012-08-01"), Sys.Date(), by="day"), N, replace=T)
char <- data.frame(matrix(sample(LETTERS, N*50, replace=T), N, 50))
val <- data.frame(matrix(rnorm(N*50), N, 50))
df <- data.frame(id, term, date, char, val, stringsAsFactors=F)
dim(df)

実際には、値は通常大きいため、これは私が使用しているものよりも少し小さいです...しかし、これは十分に近いです。

これが私のマシンでの実行時間です:

> system.time(test.plyr <- ddply(df, 
+                                .(id, term), 
+                                summarise, 
+                                seqnum = 1:length(id), 
+                                .progress="text"))
  |===============================================================================================| 100%
   user  system elapsed 
  63.52    0.03   63.85 

これを行うための「より良い」方法はありますか?残念ながら、私はWindowsマシンを使用しています。

前もって感謝します。

編集:Data.tableは非常に高速ですが、シーケンス番号を正しく計算できません。これが私のddplyバージョンが作成したものです。大多数はグループ内に1つのレコードしかありませんが、2行、3行などのレコードもあります。

> with(test.plyr, table(seqnum))
seqnum
    1     2     3     4     5 
24272  4950   681    88     9 

また、以下に示すようにdata.tableを使用すると、同じアプローチで次の結果が得られます。

> with(test.dt, table(V1))
V1
    1 
24272 
4

1 に答える 1

5

使用するdata.table

dt = data.table(df)
test.dt = dt[,.N,"id,term"]

これがタイミングの比較です。データセットの生成中にN=3000を使用し、17000を1700に置き換えました

f_plyr <- function(){
  test.plyr <- ddply(df, .(id, term), summarise, seqnum = 1:length(id), 
 .progress="text")
}

f_dt <- function(){
 dt = data.table(df)
 test.dt = dt[,.N,"id,term"]
}

library(rbenchmark)
benchmark(f_plyr(), f_dt(), replications = 10,
  columns = c("test", "replications", "elapsed", "relative"))

data.table170倍スピードアップ

test replications elapsed relative
2   f_dt()           10   0.779    1.000
1 f_plyr()           10 132.572  170.182

また、ハドリーの最新の作品をチェックしてくださいdplyrdplyr多くのコードがCで作り直されていることを考えると、追加のスピードアップが提供されても驚かないでしょう。

更新:コードを編集し、マットのコメントに従って変更length(id)しました。.N

于 2012-11-16T14:36:54.600 に答える