2015-02-05 31 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 2015-02-05 17:28:29

+0

@akrun我做了一個編輯以顯示所需的輸出;我想我也想出瞭如何回答我的問題(請參閱答案),我在這裏發佈的信息b/c我無法在其他任何地方找到此答案。 – rbatt 2015-02-05 17:41:48

回答

0

我想我只是想通了 - 關鍵是看着如何sapplymapply簡化其結果:simplify2array

我不知道,無論這個答案將工作類列表中的每個元素的(雖然我添加了一個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 2015-02-05 17:46:31

相關問題