3

quantile(X, prob = seq(0, 1, length = 5), type = 5)

これを data.table 操作に転送して新しい列を追加し、:=各 ID に値を割り当てます。値がビン内にある場合は、25%=1、50%=2 などの適切な順序値を割り当てます。各ID?

4

2 に答える 2

4

を使用できますfindIntervalquantileこれにより、 およびそのさまざまな定義を使用できるようになります。

例えば

findInterval(x, quantile(x,type=5), rightmost.closed=TRUE)

# It is fast
set.seed(1)
DT <- data.table(x=rnorm(1e6))

library(microbenchmark)


microbenchmark(
  order = DT[order(x),bin:=ceiling(.I/.N*5)],
  findInterval = DT[, b2 :=findInterval(x, quantile(x,type=5), rightmost.closed=TRUE)],times=10 )
## Unit: milliseconds
##         expr       min        lq    median       uq      max neval
##        order 551.31154 568.20324 573.36605 640.3255 655.5024    10
## findInterval  70.16782  79.11459  80.36363 140.2807 147.3080    10
于 2013-10-18T05:34:27.613 に答える
2

タイのないデータの場合、簡単な解決策は手動で分割することです...

set.seed(1)
DT <- data.table(x=rnorm(20))
DT[order(x),bin:=ceiling(.I/.N*5)]

その結果

              x bin
 1: -0.62645381   1
 2:  0.18364332   3
 3: -0.83562861   1
 4:  1.59528080   5
 5:  0.32950777   3
 6: -0.82046838   1
 7:  0.48742905   3
 8:  0.73832471   4
 9:  0.57578135   4
10: -0.30538839   2
11:  1.51178117   5
12:  0.38984324   3
13: -0.62124058   2
14: -2.21469989   1
15:  1.12493092   5
16: -0.04493361   2
17: -0.01619026   2
18:  0.94383621   5
19:  0.82122120   4
20:  0.59390132   4
于 2013-10-18T05:26:58.047 に答える