2015-09-15 3 views
4

Я надеюсь преобразовать вторую функцию lapply (# Make the new list) в цикл foreach, используя пакет foreach.Преобразование lapply в foreach?

## Example data 
lst <- lapply(1:30, function(x) lapply(1:5, function(y) rnorm(10))) 

## Make the new list 
res <- lapply(1:5, function(x) lapply(1:10, function(y) sapply(lst, function(z) z[[x]][[y]]))) 

Я не уверен, что это возможно. Меня не волнует lapply, который работает лучше, чем петли foreach. Для контекста я реорганизую список списков векторов таким образом:

new_thing[[5]][[10]][30] <- daily_by_security[[30]][[5]][10] 

Спасибо!

+0

FYI. Первое утверждение можно более элегантно переписать, используя (вложенный) 'replicate'. –

ответ

4

Чтобы понять, как решить вашу проблему, я смотрел на foreach примеры и второй один делает именно то, что вы ищете:

library("foreach") 
example(foreach) 

# equivalent to lapply(1:3, sqrt) 
foreach(i=1:3) %do% sqrt(i) 

Я затем адаптируют это к вашей проблеме:

lst <- lapply(1:30, function(x) lapply(1:5, function(y) rnorm(10))) 
resFE <- foreach(i = 1:5) %do% 
       lapply(1:10, function(y) sapply(lst, function(z) z[[i]][[y]])) 

Редактировать: OP смог найти решение, основанное на моей работе. Вот решение:

resFE <- foreach(i = 1:5, .packages = "foreach") %dopar% 
       { foreach(m = 1:10) %dopar% 
        { foreach(t = lst, .combine = c) %do% 
        { t[[i]][[m]] } } } 
+0

Спасибо! Это очень полезно. Однако я надеюсь не использовать какие-либо прикладные функции. Вы знаете, как это изменить: 'sapply (lst, function (z) z [[i]] [[m]])' to foreach? –

+0

Добро пожаловать. Мне нужно запустить, но посмотрите эту [виньетку] (https://cran.r-project.org/web/packages/foreach/vignettes/nested.pdf). Я посмотрю через это сегодня, если у меня будет время. Я думаю, он делает то, что вы хотите. –

+0

У вас была возможность взглянуть? У меня все еще есть проблемы. –

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