2015-07-31 2 views
0

Мне нужно много моделирования, и это занимает много времени. Я думаю, что время обработки может быть уменьшено до data.table. Я был бы очень признателен, если бы кто-нибудь помог мне сохранить результаты mdply(data.frame(prob=seq(from = 0.1, to = 0.9, by = 0.1)), rbinom, n = 5, size = 2) в data.table, не сохраняя свой вывод до data.frame.Сохранение результатов моделирования в виде data.table в R

library(plyr) 
df1 <- mdply(data.frame(prob=seq(from = 0.1, to = 0.9, by = 0.1)), rbinom, n = 5, size = 2) 
library(data.table) 
dt1 <- data.table(df1) 

Edited

Я знаю, что я могу использовать setDT(df1), чтобы избежать создания в dt1. Однако основная проблема - около mdply, которая создает data.frame, который потребляет много времени.

+0

Если вы используете 'setDT (df1) 'он превращает' df1' в data.table «по ссылке», и вам не нужно назначать результат/создавать другой объект (вы можете посмотреть на него документы). Я не читаю plyrish, поэтому я не могу комментировать его изменение. – Frank

+0

Да, я знаю, что я могу использовать 'setDT (df1)', чтобы избежать создания в 'dt1'. Однако главная проблема заключается в 'mdply', который создает' data.frame'. – MYaseen208

+0

Почему бы вам не превратить его в 'data.table' перед запуском' rbinom'? –

ответ

3

plyr и data.table предназначены для очень похожих целей, поэтому вам обычно не нужно переключаться между ними вообще. Вы можете делать все с data.table в этом случае:

dt = data.table(prob = seq(0.1, 0.9, by = 0.1)) 
dt = dt[, as.list(rbinom(prob, n = 5, size = 2)), by = prob] 
dt 
    prob V1 V2 V3 V4 V5 
1: 0.1 0 0 0 0 0 
2: 0.2 0 0 0 0 1 
3: 0.3 1 2 1 0 1 
4: 0.4 1 1 2 1 0 
5: 0.5 2 2 1 1 1 
6: 0.6 1 1 0 0 1 
7: 0.7 2 1 2 1 0 
8: 0.8 2 1 2 0 1 
9: 0.9 2 2 2 2 2 

Я хотел бы добавить, что моя догадка, что самый быстрый способ сделать это было бы сделать матрицу первой, а затем назначить столбцы.

> mat = mapply(rbinom, prob = dt$prob, n = 5, size = 2) 
> cbind(dt, t(mat)) 
    prob V1 V2 V3 V4 V5 
1: 0.1 0 0 0 0 0 
2: 0.2 1 0 0 1 1 
3: 0.3 1 1 1 0 0 
4: 0.4 1 0 2 1 1 
5: 0.5 1 1 1 0 2 
6: 0.6 2 0 2 1 1 
7: 0.7 1 1 1 2 1 
8: 0.8 1 2 1 0 2 
9: 0.9 1 1 2 1 1 

Очень быстрый тест на 8000 строка таблицы показывает, что это быстрее:

> dt = data.table(prob = (seq(0.1, 0.9, by = 0.00001))) 
> system.time(for(i in 1:10) dt[, as.list(rbinom(prob, n = 5, size = 2)), by = prob]) 
    user system elapsed 
    6.14 0.00 6.16 
> system.time(for(i in 1:10) {mat = mapply(rbinom, prob = dt$prob, n = 5, size = 2) ; cbind(dt, t(mat))}) 
    user system elapsed 
    2.61 0.00 2.62 

И оба существенное улучшение на оригинал:

> system.time(for(i in 1:10) {df1 = mdply(df, rbinom, n = 5, size = 2) ; dt1 = data.table(df1)}) 
    user system elapsed 
152.23 46.60 200.07 
+0

Также быстро сохраняется в длинном формате 'system.time (для (i в 1:10) {dt2 <- dt [, rbinom (prob, n = 5, size = 2), by = prob] [, ind: = paste0 ("V", 1: 5)]}) ', если он действительно нужен в широком формате, все еще существует довольно быстрый' dcast (dt2, prob ~ ind, value.var = "V1") 'Я вижу комбо примерно в 2 раза быстрее, чем подход 'as.list'. – Frank

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