2017-03-17 38 views
0

這就是我到目前爲止所做的。爲了速度的目的,我想在dplyr或data.table中使用它。R:如何基於由另一列分組的數據幀中的前一行創建第90個分位數的新列?

test <- data.table(a = c(1,2,3,4,5,6), 
        b = c("a", "b", "c", "a", "b", "c") , 
        c = c(1,7,11,4,5,5)) 

    a b c 
1: 1 a 1 
2: 2 b 7 
3: 3 c 11 
4: 4 a 4 
5: 5 b 5 
6: 6 c 5 

test[, a90 := lapply(.I, function(x) quantile(a[0:x], 0.9, na.rm = TRUE)), by = b] 

test 

這就是我得到:

a b c a90 
1: 1 a 1 1.0 
2: 2 b 7 4.7 
3: 3 c 11 5.7 
4: 4 a 4 1.0 
5: 5 b 5 4.7 
6: 6 c 5 5.7 

我不知道它是如何得到這個。 我想這個地方實際上是由B和各組的90位數分組:

a b c a90 
1: 1 a 1 1.0 
2: 2 b 7 2.0 
3: 3 c 11 3.0 
4: 4 a 4 3.7 
5: 5 b 5 4.7 
6: 6 c 5 5.7 
+1

:這可以通過使用cumstats包來完成。在你的代碼中,你得到'a'的分位數,但是在預期中,似乎你想爲'c'分位數? – akrun

+1

這看起來像一個非常沒有希望的任務,除非你想出了一些聰明的算法。無論如何,一種方法是測試[。(b = b,a = a),on =。(b,a <= a),quantile(c,.9,na.rm = TRUE),by = .EACHI] '。順便說一句,在R中,'a [0:x]'不是一件事 - 矢量從1開始索引。另外,在data.table中'.I'指的是整個表的行,所以使用'1 :.N'是否需要組內計數器。 – Frank

+1

@Frank從預期的結果看來,OP似乎要計算與'cumsum()'類似的_累積分位數。最近發佈的'cumstats'軟件包有這樣一個野獸。不確定是什麼表現。 – Uwe

回答

1

從預期的結果,似乎要計算累計位數類似cumsum()。如果你是「B」,你如何爲「B」相同的價值觀得到不同的值分組

test[, a90 := cumstats::cumquant(a, .9), by = b][] 
# a b c a90 
#1: 1 a 1 1.0 
#2: 2 b 7 2.0 
#3: 3 c 11 3.0 
#4: 4 a 4 3.7 
#5: 5 b 5 4.7 
#6: 6 c 5 5.7