foreach() в R: вернуть два элемента, rbind все первые элементы и все вторые элементы отдельно

У меня есть эта проблема с использованием R и пакета foreach для параллельной обработки.

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

    day = foreach (h = 1:24, .combine=rbind)   %dopar%     {
    ...
    singlematrix         # return a single matrix
    }
    24matrices <- day
    # thanks to rbind, all single matrices are piled together

Каждый цикл возвращает матрицу, а .combine=rbind делает так, что я получаю большую матрицу, состоящую из 24 отдельных матриц.

Если вместо того, чтобы возвращать матрицу при каждом h, я хочу добиться чего-то вроде:

    day = foreach (h = 1:24, .combine=rbind)   %dopar%     {
    ...
    list("row"=singlerow, "matrix"=singlematrix)     # return both
    }
    24rows <- day[[1]]             # singlerows piled up
    24matrices <- day[[2]]         # singlematrices piled up

как я могу сложить вместе все 24 одиночных строки и все 24 одиночные матрицы вместе, не смешивая строки и матрицы?

Я попытался вставить .multicombine=TRUE, вернув list( "row"=item1, "matrix"=item2), но строки и матрицы смешиваются. К сожалению, я не очень хорошо разбираюсь в lapply, и, возможно, это правильный путь. Большое спасибо!


person Federico    schedule 22.08.2015    source источник


Ответы (1)


Я предположу, поскольку у меня нет фактической структуры ваших повседневных матриц, но, возможно, это направит вас в правильном направлении:

set.seed(42)
library(foreach)
day <- foreach(h = 1:24) %dopar% {
    ## ...
    mtx1 <- matrix(sample(6), nr=2)
    mtx2 <- matrix(sample(8), nr=2)
    list(mtx1, mtx2)
}

length(day)
## [1] 24
str(day[[1]])
## List of 2
##  $ : int [1:2, 1:3] 6 5 2 3 4 1
##  $ : int [1:2, 1:4] 6 1 4 8 2 3 5 7

ret1 <- do.call('rbind', lapply(day, `[[` , 1))
ret2 <- do.call('rbind', lapply(day, `[[` , 2))

str(ret1)
##  int [1:48, 1:3] 6 5 3 5 3 5 1 5 5 1 ...
str(ret2)
##  int [1:48, 1:4] 6 1 8 1 1 6 8 5 7 4 ...
person r2evans    schedule 22.08.2015