我有一個data.table列p1
,p2
,...其中包含百分比。我想計算給定參考變量val
的每列的分位數。從概念上講,這是這樣的:R - 通過固定列到lapply函數data.table
quantile(val, p1, type = 4, na.rm = T)
quantile(val, p2, type = 4, na.rm = T)
...
我在使用data.table嘗試如下:
fun <- function(x, y) quantile(y, x, type = 4, na.rm = T)
dt[, c('q1', 'q2') := lapply(.SD, fun), .SDcols = c('p1', 'p2'), by = grp]
where grp is some grouping variable
但是,我無法確定在保持其固定的方式y
變量。
我試過如下:
fun <- function(x, y, dt) quantile(dt[, y], x, type = 4, na.rm = T)
dt[, c('q1', 'q2') := lapply(.SD, fun, y, dt), .SDcols = c('p1', 'p2'), by = grp]
做起來這種方式,當位數計算不強制分組。它將根據組內的y
變量的整個範圍而不是y
來計算分位數。什麼是正確的方法來做到這一點?
編輯:
這裏只是一個變量的一個簡單的例子:
> dt <- data.table(y = 1:10, p1 = rep(seq(0.2, 1, 0.2), 2), g = c(rep('a', 5), rep('b', 5)))
> dt
y p1 g
1: 1 0.2 a
2: 2 0.4 a
3: 3 0.6 a
4: 4 0.8 a
5: 5 1.0 a
6: 6 0.2 b
7: 7 0.4 b
8: 8 0.6 b
9: 9 0.8 b
10: 10 1.0 b
> fun <- function(x, dt, y) quantile(dt[, y], x, type = 4, na.rm = T)
> dt[, c('q1') := lapply(.SD, fun, dt, y), .SDcols = c('p1'), by = c('g')]
> dt
y p1 g q1
1: 1 0.2 a 2
2: 2 0.4 a 4
3: 3 0.6 a 6
4: 4 0.8 a 8
5: 5 1.0 a 10
6: 6 0.2 b 2
7: 7 0.4 b 4
8: 8 0.6 b 6
9: 9 0.8 b 8
10: 10 1.0 b 10
可以看到Q1是使用y
的整個範圍來計算。
你可以發佈一個可重複的例子,包括'dt'包含什麼。變量「y」是否與您希望計算分位數的百分比真的在同一個表中? – mnel
'lapply'應該與一個參數的函數一起使用。如果你需要兩個或更多,'mapply'可能會有所幫助。 – Frank
@ mnel:我添加了一個簡單的例子 – ezbentley