2013-11-26 23 views
0

我有一個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的整個範圍來計算。

+0

你可以發佈一個可重複的例子,包括'dt'包含什麼。變量「y」是否與您希望計算分位數的百分比真的在同一個表中? – mnel

+0

'lapply'應該與一個參數的函數一起使用。如果你需要兩個或更多,'mapply'可能會有所幫助。 – Frank

+0

@ mnel:我添加了一個簡單的例子 – ezbentley

回答

1

我發現,你將存儲作爲數據與您要計算位數很奇怪,你在同一個data.table需要百分比的想法,但在這裏是一種方法,將工作

dt <- data.table(x=10:1,y = 1:10, p1 = rep(seq(0.2, 1, 0.2), 2), g = c(rep('a', 5), rep('b', 5))) 


dt[, c('qx','qy') := Map(f = quantile, x = list(x, y), prob = list(p1), type = 4), by = g] 

您可以使用.SDcols.SD選擇要

dt[, c('qx','qy') := Map(f = quantile, x = .SD[, .SDcols = c('x','y')], 
         prob = list(p1), type = 4), by = g] 

列或使用with =FALSE

dt[, c('qx','qy') := Map(f = quantile, x = .SD[, c('x', 'y'), with = FALSE], 
          prob = list(p1), type = 4), by = g] 
+0

謝謝。它效果很好。你碰巧知道如何通過字符串指定'x'?我有很多列'vars < - c('x1','x2',....,'x50')',我想以某種方式把它放入像'x = list(vars)'中,但它沒有'工作。 – ezbentley

+0

@ezbentley - 根據我的編輯使用'.SD'。 – mnel

+0

非常感謝。我仍然在學習data.table的技巧。 – ezbentley