2012-06-26 2 views
-2

Допустим, у меня есть пример кодаНепосредственно присвоить результаты DoMC (Еогеасп) для кадра данных

kkk<-data.frame(m.mean=1:1000, m.sd=1:1000/20) 
kkk[,3:502]<-NA 

for (i in 1:nrow(kkk)){ 
    kkk[i,3:502]<-rnorm(n=500, mean=kkk[i,1], sd=kkk[i,2]) 
} 

Я хотел бы преобразовать эту функцию для запуска параллельно с doMC. Моя проблема заключается в том, что foreach приводит к списку, тогда как результаты каждой итерации мне нужны, чтобы быть вектором, который затем может быть перенесен в фрейм данных (который позже будет экспортирован как CVS для дальнейшей обработки).

Любые идеи?

+0

вы хотите аргумент '.combine'' foreach'. Взгляните на '? Foreach', и вы можете увидеть примеры. – Justin

+0

Я знаю аргумент «.combine», однако, как я вижу, это подразумевает создание другого вектора (с результатами), а затем передачу результатов в мой исходный фрейм данных. Можно ли сохранить этот шаг/время? (Мой набор данных большой и итераций в масштабе 100 000). Спасибо – ECII

+1

Это кажется хорошим местом для использования 'data.table'. – Andrie

ответ

1

Для этого вам не нужен цикл, и помещать большую матрицу чисел в фрейм данных только для обработки, так как матрица неэффективна (хотя вам может понадобиться создать кадр данных в конце после выполняя всю вашу математику для записи в файл CSV).

m.mean <- 1:1000 
m.sd <- 1:1000/20 
num.columns <- 500 
x <- matrix(nrow=length(m.mean), ncol=num.columns, 
      data=rnorm(n=length(m.mean) * num.columns)) 
x <- x * cbind(m.sd)[,rep(1,num.columns)] + cbind(m.mean)[,rep(1,num.columns)] 
kkk <- data.frame(m.mean=m.mean, m.sd=m.sd, unname(x)) 
write.csv(kkk, "kkk.txt") 

Чтобы ответить на исходный вопрос о назначении непосредственно результаты существующей структуры данных из цикла Еогеасп, что не представляется возможным. Параллельные серверы пакета foreach предназначены для выполнения каждого вычисления в отдельном R-процессе, поэтому каждый должен возвращать отдельный объект в родительский процесс, который собирает их с помощью функции .combine, предоставленной для foreach. Вы можете написать параллельный цикл foreach, который присваивает непосредственно переменной kkk, но это не будет иметь никакого эффекта, поскольку каждое присваивание произойдет в отдельных процессах и не будет передано основному процессу.

+0

Спасибо за ваш ответ. Я знаю, что для примера не нужен цикл. Я просто написал это, чтобы представить дело. – ECII