2015-02-05 2 views
0

%dopar%foreach을 사용할 예정이며 출력을 결합해야합니다.목록의 해당 요소를 벡터 또는 목록으로 결합하십시오.

병렬로 호출 할 함수는 각 호출에 대해 일정한 길이를 갖는 목록을 출력합니다. 그러나이 목록의 요소 길이는 항상 일정하지는 않습니다.

결합 후 결과를 최대한 단순화하고 각 요소의 원본 목록 (반복)을 식별 할 수있게하고 싶습니다.

B/C 길이가 이보다 깊은 곳에서 다르다면, answers like this은 나를 거기에 데려다주지 않습니다.

list1 <- list(rnorm(1), rnorm(1), rnorm(1), rnorm(8)) 
list2 <- list(rnorm(1), rnorm(1), rnorm(1), rnorm(8)) 
list3 <- list(rnorm(1), rnorm(1), rnorm(1), rnorm(14)) 

do.call(Map, c(c, list(list1, list2, list3)))이 제공 :

[[1]] 
    [1] -0.2923462 0.4891224 -0.5080176 

    [[2]] 
    [1] 0.3229466 0.9511572 -0.9815504 

    [[3]] 
    [1] -1.160413 0.707568 -1.564874 

    [[4]] 
    [1] -1.13093146 0.06791923 0.65380844 1.01829862 0.47360903 0.68616334 -1.07166155 -1.54018814 -0.60860430 1.64524185 0.40222817 -0.54747627 
    [13] -1.73420011 0.67861611 0.55527953 1.36454409 0.40215155 -0.65706184 -0.71008434 -1.11484886 -0.69811408 -0.45451101 -0.85574891 -0.79241329 
    [25] 0.31018144 -0.03212242 -1.55192430 -2.19142725 -1.85528112 0.85204097 

do.call(Map, c(list, list(list1, list2, list3)))이 제공 :

[[1]] 
[[1]][[1]] 
[1] -0.2923462 

[[1]][[2]] 
[1] 0.4891224 

[[1]][[3]] 
[1] -0.5080176 


[[2]] 
[[2]][[1]] 
[1] 0.3229466 

[[2]][[2]] 
[1] 0.9511572 

[[2]][[3]] 
[1] -0.9815504 


[[3]] 
[[3]][[1]] 
[1] -1.160413 

[[3]][[2]] 
[1] 0.707568 

[[3]][[3]] 
[1] -1.564874 


[[4]] 
[[4]][[1]] 
[1] -1.13093146 0.06791923 0.65380844 1.01829862 0.47360903 0.68616334 -1.07166155 -1.54018814 

[[4]][[2]] 
[1] -0.6086043 1.6452418 0.4022282 -0.5474763 -1.7342001 0.6786161 0.5552795 1.3645441 

[[4]][[3]] 
[1] 0.40215155 -0.65706184 -0.71008434 -1.11484886 -0.69811408 -0.45451101 -0.85574891 -0.79241329 0.31018144 -0.03212242 -1.55192430 -2.19142725 
[13] -1.85528112 0.85204097 

편집, 정답이 같은 것을 좋아해야합니다 (용서 여기

몇 가지 예를 들어 데이터의 RNG) :

part1 <- do.call(Map, c(c, list(list1, list2, list3))) 
part2 <- do.call(Map, c(list, list(list1, list2, list3))) 
correct <- list(part1[[1]], part1[[2]], part1[[3]], part2[[4]]) 
correct 
[[1]] 
[1] 1.80341685 -0.06408827 0.07004951 

[[2]] 
[1] 0.4389224 -0.1821140 0.2538133 

[[3]] 
[1] 0.008303713 -1.004631075 1.936738072 

[[4]] 
[[4]][[1]] 
[1] -0.86790931 1.20414809 0.04373068 -0.49097606 1.12826503 -0.76263091 -0.93364770 0.13392904 

[[4]][[2]] 
[1] -1.0823008 -0.4382813 1.4328709 -0.8961412 0.8350054 1.4855032 -1.3800748 1.4300227 

[[4]][[3]] 
[1] 0.02126034 0.30640618 0.49420442 0.72107997 0.97666620 -0.48049810 1.22227279 -1.00918452 -0.23290645 -1.27834163 2.55142878 1.07120297 
[13] 1.37473759 0.72308135 

나는 또한리스트의 요소가 반드시 숫자 아니라는 것을 지적한다 - 그들은 jags()에서, 예를 들어 모델의 출력을, 수 있습니다.

c을 사용하면 첫 번째 부분이 (내가 원하는 것과 관련된) 오른쪽으로 가져오고 list을 사용하면 마지막 부분을 올바르게 가져옵니다. 어떻게하면 두 세계의 장점을 얻을 수 있습니까?

+0

예상 결과는 무엇입니까 – akrun

+0

@akrun 원하는 출력을 표시하도록 편집했습니다. 나는 또한 내 질문에 대답하는 방법을 알아 냈다고 생각한다. (대답 참조). 나는 여기에 게시하고 있는데, 나는 다른 곳에서는이 답을 찾을 수 없었다. – rbatt

답변

0

방금 ​​알아 낸 것 같습니다. sapplymapply의 결과는 간단합니다. simplify2array.

I (나는 이것을 테스트하려고하는 lm 객체를 추가하더라도)이 대답은리스트의 각 요소의 클래스에 상관없이 작동합니다 확실하지 않다 : 제대로 결과

list1 <- list(rnorm(1), rnorm(1), rnorm(1), rnorm(8), list(lm(y1~x1))) 
list2 <- list(rnorm(1), rnorm(1), rnorm(1), rnorm(8), list(lm(y1~x1))) 
list3 <- list(rnorm(1), rnorm(1), rnorm(1), rnorm(14), list(lm(y1~x1))) 

lapply(do.call(Map, c(list, list(list1, list2, list3))), simplify2array) 

:

[[1]] 
[1] -0.3947090 0.3347808 -0.3404769 

[[2]] 
[1] -0.4661581 1.0141749 0.3178242 

[[3]] 
[1] 0.4460540 -0.3971673 0.7291202 

[[4]] 
[[4]][[1]] 
[1] 0.15486131 0.04511161 0.79932793 0.31679677 -1.05818552 -0.59902937 0.05348751 -1.28561604 

[[4]][[2]] 
[1] -1.1898877 -0.9595261 1.2784798 0.6056794 0.2355697 -0.5116538 -1.0667602 2.1319707 

[[4]][[3]] 
[1] -0.03475871 0.50329073 -1.25297549 0.75347700 0.30558110 0.39872038 0.62724542 0.14938488 0.42032236 0.20953381 1.26509289 0.47796645 
[13] 0.33260481 1.10625794 


[[5]] 
[[5]][[1]] 

Call: 
lm(formula = y1 ~ x1) 

Coefficients: 
(Intercept)   x1 
    0.2366  -0.4091 


[[5]][[2]] 

Call: 
lm(formula = y1 ~ x1) 

Coefficients: 
(Intercept)   x1 
    0.2366  -0.4091 


[[5]][[3]] 

Call: 
lm(formula = y1 ~ x1) 

Coefficients: 
(Intercept)   x1 
    0.2366  -0.4091 
+1

wouldnt'lapply (map (list, list1, list2, list3), simplify2array)'같은 결과가 나옵니까? (원본 게시물의 데이터 세트를 기반으로 함) – akrun

관련 문제