我想在定制的子集中獲得分位數。例如在以下資料集中:
data = data.table(x=c(rep(1,9),rep(2,9)),y=c(rep(1:6,each=3)),z=1:18)
- 對于每一行i,我想知道在x=x[i]和y=<y[i]的行中,50%tile(以及進一步計算中的其他分位數,例如 10%tile, 5% tile) 的z[i]。
預期的輸出將是
c(2,2,2,3.5,3.5,3.5,5,5,5,11,11,11,12.5,12.5,12.5,14,14,14)
- 對于每一行i,我想知道在x=x[i]和y=<y[i]的行中z[i]的平均值。
預期輸出將是(在此資料集中與 1 相同,但在其他資料集中會有所不同)。
c(2,2,2,3.5,3.5,3.5,5,5,5,11,11,11,12.5,12.5,12.5,14,14,14)
我可以為它撰寫一個函式并使用 apply 在每一行上回圈它。但是,資料集有超過 30,000,000 行,這需要幾天時間。在 R data.table 或 tidyverse 或其他包中是否有更快的計算方法?
uj5u.com熱心網友回復:
使用非 equi 加入data.table
data[data, quantile(z, 0.5), on = .(x = x, y <=y), by = .EACHI]$V1
#[1] 2.0 2.0 2.0 3.5 3.5 3.5 5.0 5.0 5.0 11.0 11.0 11.0 12.5 12.5 12.5 14.0 14.0 14.0
如果我們想創建一個列
data[data[unique(data[, .(x, y)]), quantile(z, 0.5),
on = .(x = x, y <=y), by = .EACHI], z_mean := V1, on = .(x, y)]
-輸出
> data
x y z z_mean
<num> <int> <int> <num>
1: 1 1 1 2.0
2: 1 1 2 2.0
3: 1 1 3 2.0
4: 1 2 4 3.5
5: 1 2 5 3.5
6: 1 2 6 3.5
7: 1 3 7 5.0
8: 1 3 8 5.0
9: 1 3 9 5.0
10: 2 4 10 11.0
11: 2 4 11 11.0
12: 2 4 12 11.0
13: 2 5 13 12.5
14: 2 5 14 12.5
15: 2 5 15 12.5
16: 2 6 16 14.0
17: 2 6 17 14.0
18: 2 6 18 14.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/480526.html
