2015-05-13 2 views
4

Я хочу вычислить квантили каждой строки кадра данных и вернуть результат в виде матрицы. Так как я хочу, чтобы вычислить и произвольное число квантилей (и я думаю, что это быстрее, чтобы вычислить их все сразу, а не повторного запуска функции), я попытался с помощью формулы я нашел в this question:Почему sum() работает в этом выражении dplyr, а quantile() - нет?

library(dplyr) 
df<- as.data.frame(matrix(rbinom(1000,10,0.5),nrow = 2)) 

interim_res <- df %>% 
       rowwise() %>% 
       do(out = sapply(min(df):max(df), function(i) sum(i==.))) 

interim_res <- interim_res[[1]] %>% do.call(rbind,.) %>% as.data.frame(.) 

Это имеет смысл, но когда я пытаюсь применить ту же структуру функции quantile() как закодировано,

interim_res <- df %>% 
       rowwise() %>% 
       do(out = quantile(.,probs = c(0.1,0.5,0.9))) 

interim_res <- interim_res[[1]] %>% do.call(rbind,.) %>% as.data.frame(.) 

Я получаю сообщение об ошибке:

Ошибка в роде .int (х, na.last = na.last, уменьшаясь = уменьшается, ...):

'х' должен быть атомарным

Почему я получаю сообщение об ошибке с quantile и не sum? Как мне исправить эту проблему?

+0

В вашем примере квантиля вычисляются по переменным в data.frame, а не по наблюдениям. Это довольно необычно. Вы уверены, что это то, что вы хотели? – akhmed

+0

Столбцы представляют собой результаты моделирования, а строки - это разные конфигурации параметров. –

ответ

8

. in do - это кадр данных, поэтому вы получаете ошибку. Это работает:

df %>% 
    rowwise() %>% 
    do(data.frame(as.list(quantile(unlist(.),probs = c(0.1,0.5,0.9))))) 

, но риск быть ужасно медленным. Почему не просто:

apply(df, 1, quantile, probs = c(0.1,0.5,0.9)) 

Вот некоторые тайминги с большей данных:

df <- as.data.frame(matrix(rbinom(100000,10,0.5),nrow = 1000)) 

library(microbenchmark) 
microbenchmark(
    df %>% rowwise() %>% do(data.frame(as.list(quantile(unlist(.),probs = c(0.1,0.5,0.9))))), 
    apply(df, 1, quantile, probs = c(0.1,0.5,0.9)), 
    times=5 
) 

Производит:

  min  lq  mean median  uq  max neval 
dplyr 2375.2319 2376.6658 2446.4070 2419.4561 2454.6017 2606.0794  5 
apply 224.7869 231.7193 246.7137 233.4757 245.0718 298.5144  5  

Если вы идете apply маршрут вы, вероятно, следует придерживаться с матрицей из получить идти.

Смежные вопросы