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
:這可以通過使用
cumstats
包來完成。在你的代碼中,你得到'a'的分位數,但是在預期中,似乎你想爲'c'分位數? – akrun這看起來像一個非常沒有希望的任務,除非你想出了一些聰明的算法。無論如何,一種方法是測試[。(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
@Frank從預期的結果看來,OP似乎要計算與'cumsum()'類似的_累積分位數。最近發佈的'cumstats'軟件包有這樣一個野獸。不確定是什麼表現。 – Uwe