(私の標準では)かなり大きなデータセットがあり、レコードのブロックのシーケンス番号を作成したいと思います。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