正しく並べるには、これを「id」で並べ替える必要があると思います。幸いなことに、これはキーを設定すると自動的に行われます。
dat <-read.table(text="dte, id, val1, val2
2001-10-02, 1, 10, 25
2001-10-03, 1, 11, 24
2001-10-04, 1, 12, 23
2001-10-02, 2, 13, 22
2001-10-03, 2, 14, 21
", header=TRUE, sep=",")
dtb <- data.table(dat)
setkey(dtb, "id")
dtb[, residuals(lm(val1 ~ val2)), by="id"]
#---------------
cbind(dtb, dtb[, residuals(lm(val1 ~ val2)), by="id"])
#---------------
dte id val1 val2 id.1 V1
[1,] 2001-10-02 1 10 25 1 1.631688e-15
[2,] 2001-10-03 1 11 24 1 -3.263376e-15
[3,] 2001-10-04 1 12 23 1 1.631688e-15
[4,] 2001-10-02 2 13 22 2 0.000000e+00
[5,] 2001-10-03 2 14 21 2 0.000000e+00
> dat <- data.frame(dte=Sys.Date()+1:1000000,
id=sample(1:2, 1000000, repl=TRUE),
val1=runif(1000000), val2=runif(1000000) )
> dtb <- data.table(dat)
> setkey(dtb, "id")
> system.time( cbind(dtb, dtb[, residuals(lm(val1 ~ val2)), by="id"]) )
user system elapsed
1.696 0.798 2.466
> system.time( dtb[,transform(.SD,r = residuals(lm(val1~val2))),by = "id"] )
user system elapsed
1.757 0.908 2.690
マシューからの編集:これは、CRANのv1.8.0ではすべて正しいです。data.table wikiポイント2の主題である小さな追加でtransform
、 「スピードのために、後でグループごとにしないでください」。ただし、v1.8.1ではグループごとに機能するようになり、シンプルかつ高速になりました。説明のために私の答えを参照してください(ただし、投票する必要はありません)。j
transform()
cbind()
:=
さて、私はそれに投票しました。Macにv1.8.1をインストールするためのコンソールコマンドは次のとおりです(適切なXCodeツールが利用できる場合は、ソースにのみ存在するため)。
install.packages("data.table", repos= "http://R-Forge.R-project.org", type="source",
lib="/Library/Frameworks/R.framework/Versions/2.14/Resources/lib")
(何らかの理由で、Mac GUIパッケージインストーラーにr-forgeをリポジトリとして読み取らせることができませんでした。)