4

uniqueキー付きで呼び出すと、data.table各グループごとに一意の行が表示されます。行が重複している場合は、最初の行が取得されます。代わりに最後を取得する必要がある場合(一般的には最後の一時的なトランザクション)、使用します.SD[.N]

library(data.table)
library(microbenchmark)

dt <- data.table(id=sample(letters, 10000, T), var=rnorm(10000), key="id")

microbenchmark(unique(dt), dt[, .SD[.N], by=id])
Unit: microseconds
                   expr      min        lq    median       uq        max neval
             unique(dt)  570.882  586.1155  595.8975  608.406   3209.122   100
 dt[, .SD[.N], by = id] 6532.739 6637.7745 6694.3820 6776.968 208264.433   100

同じことをするより速い方法を知っていますか?

4

3 に答える 3

8

キー変数の一意の組み合わせを含む を作成し、data.table次を使用して結合しますmult = 'last'

使用.SDは便利ですが、遅いです。.I必要に応じて代わりに使用できます。

dtu <- unique(dt)[,key(dt), with = FALSE]
dt[dtu, mult = 'last']

または

 dt[ dt[,  .I[.N], by = key(dt)]$V1]
于 2013-07-10T21:37:55.213 に答える
4

data.tablev1.9.4から、ご利用いただけますfromLast = TRUE

microbenchmark(unique(dt, by = "id"), 
               dt[, .SD[.N], by=id], 
               unique(dt, by = "id", fromLast = TRUE))

Unit: microseconds
                                   expr     min       lq     mean   median       uq      max neval cld
                  unique(dt, by = "id") 333.978 355.1900 406.1585 371.1360 393.4015 3203.769   100  a 
                 dt[, .SD[.N], by = id] 519.320 541.4345 580.2176 553.6200 563.5490 2690.167   100   b
 unique(dt, by = "id", fromLast = TRUE) 338.190 366.4725 430.1296 380.9145 400.7730 4774.663   100  a 
于 2016-12-31T12:49:12.693 に答える