2015-03-13 2 views
1

Я пытаюсь запустить симуляцию параллельно.Обработка списка данных в R

iterations = 50000 
sim = foreach(i=1:iterations) %dopar% sim(dataframe, ...) 

Каждый элемент в списке sim является фреймворком данных с 40 столбцами и 100 строками. Каждый блок данных имеет столбец идентификатора. Я хочу определить средний балл по идентификатору более 50 000 симуляций.

Я попытался следующие, но это было довольно медленно, я думаю, потому что приходилось постоянно отращивать в dataframe:

results = do.call(rbind.data.frame, sim) 
avg.scores = ddply(sim,~Player,summarise,mean=mean(score)) 

Я также попытался установить атрибуты в списке, чтобы преобразовать его в dataframe в (Most efficient list to data.frame method?), но закончил с более чем 25 столбцами и разными именами столбцов

Я не уверен, есть ли способ вычислить средние значения путем повторения по спискам или мне нужно создать dataframe или datatable сначала, а затем вычислить средние значения.

Благодарим за любые предложения!

+0

Использование 'rbindlist' Дром data.table пакет – Metrics

ответ

0

Если идентификаторы разбросаны по всем кадрам данных в списке, то да, вам нужно будет сделать дополнительный шаг, чтобы вытащить все аналогичные идентификаторы в соответствующие таблицы или просто объединить и сгруппировать по.

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

library(doParallel) 
library(plyr) 
library(data.table) 
iter <- 5E4 
simulations <- foreach(i = 1:iter, .combine = rbind) %dopar% { 
    data.table(ID = sample(LETTERS, 100, replace = TRUE), matrix(runif(390), ncol = 39)) 
} 

Вы можете взять среднее из одного или нескольких столбцов с помощью .SD:

means.by.ID.and.column <- simulations[, lapply(.SD, mean), by = ID, .SDcols = 2:40] 
+0

@ user515663 ли это ответ на ваш вопрос? Если, пожалуйста, примите, если нет, то как я могу его улучшить? – mlegge

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