2017-10-12 50 views
2

我想矢量化在R中創建一個列表,但只能得到我想要的嵌套for循環。我已經包含了我的問題重現性的大大簡化版本。有人可以幫我修改或替換我的mapply功能嗎?如何複製一個嵌套for循環與mapply?

所需的功能:

my_list <- list() 
A <- c("one", "two", "three", "four") 
B <- c("left", "right") 
for (a in A) { 
    for (b in B) { 
     my_list <- c(my_list, paste(a, b)) 
    } 
} 
print(my_list) 

輸出(爲簡潔起見編輯空格):

[[1]] [1] "one left" 
[[2]] [1] "one right" 
[[3]] [1] "two left" 
[[4]] [1] "two right" 
[[5]] [1] "three left" 
[[6]] [1] "three right" 
[[7]] [1] "four left" 
[[8]] [1] "four right" 

我試圖向量化的:

combinate <- function(a, b) { 
    return(paste(a, b)) 
} 
mapply(combinate, a=A, b=B, SIMPLIFY=FALSE) 

輸出:

$one [1] "one left" 
$two [1] "two right" 
$three [1] "three left" 
$four [1] "four right" 

我不關心標籤;我很擔心從這兩個列表中獲取所有八個結果。我已經找到了文檔,通過將兩個列表中的第一個項目配對,然後從兩個列表中的第二個項目重複較短的列表,mapply正在完成它應該做的事情。但經過大量搜索之後,我無法找到必須存在的內容,這種方法可以像嵌套for循環一樣組合地對所有列表項進行配對。

回答

3

我們可以expand.grid做,paste

v1 <- do.call(paste, expand.grid(A, B)) 

或用outer

v1 <- c(outer(A, B, paste)) 

如果這些需求是在一個list

as.list(v1) 

與OP的輸出

identical(as.list(c(t(outer(A, B, paste)))), my_list) 
#[1] TRUE 
+0

我學習困難的方式檢查,雖然這些做什麼我問過的問題,他們不發揮作用不太一樣了-循環。粘貼功能沒有被調用8次,每次都有不同的變量,但傳遞了兩個列表或8個項目的數組。外部函數期望粘貼函數(或您提供的任何自定義函數)可以正確處理。或者如果我仍然誤解,請糾正我。 :) – mightypile

+0

@mightypile在'outer'中,'FUN'參數是'paste'。 「外層」做的是獲得每個向量元素的組合,並通過指定「粘貼」爲「FUN」,它正在粘貼 – akrun