为R中向量中的每个元素的两个值创建所有可能的组合

时间:2016-08-22 05:11:04

标签: r loops

我一直在尝试创建向量,其中每个元素可以在两个不同的向量中存在两个不同的值 例如,如果有两个向量a和b,其中a是c(6,2,9),b是c(12,5,15),那么输出应该是8个向量,如下所示,

6   2   9  
6   2  15  
6   5   9  
6   5  15  
12  2   9  
12  2  15  
12  5   9  
12  5  15  

以下代码可以使用,

aa1 <- c(6,12)
aa2 <- c(2,5)
aa3 <- c(9,15)
for(a1 in 1:2)
  for(a2 in 1:2)
   for(a3 in 1:2)
   {
     v <- c(aa1[a1],aa2[a2],aa3[a3])
     print(v)
   }

但是我想知道是否有更简单的方法来做这个而不是写几个for循环,这也会随着最终向量的元素数量线性增加。

2 个答案:

答案 0 :(得分:1)

我认为你要找的是expand.grid。

a <- c(6,2,9)
b <- c(12,5,15)

expand.grid(a,b)
 Var1 Var2
1    6   12
2    2   12
3    9   12
4    6    5
5    2    5
6    9    5
7    6   15
8    2   15
9    9   15

答案 1 :(得分:1)

expand.grid是一个函数,可以使你传递的任何矢量的所有组合,但在这种情况下你需要重新排列你的矢量,所以你有一对第一元素,第二元素和第三元素,所以最终电话是:

expand.grid(c(6, 12), c(2, 5), c(9, 15))

重新排列基数R中向量的快捷方法是Maplapply的多变量版本,c()为函数:

a <- c(6, 2, 9)
b <- c(12, 5, 15)

Map(c, a, b)

## [[1]]
## [1]  6 12
## 
## [[2]]
## [1] 2 5
## 
## [[3]]
## [1]  9 15

方便地expand.grid对单个向量或向量列表感到满意,所以我们可以调用:

expand.grid(Map(c, a, b))

##   Var1 Var2 Var3
## 1    6    2    9
## 2   12    2    9
## 3    6    5    9
## 4   12    5    9
## 5    6    2   15
## 6   12    2   15
## 7    6    5   15
## 8   12    5   15

如果Map让您感到困惑,如果您将ab放入列表中,purrr::transpose将执行相同的操作,请从两个元素的列表中翻转长度为三的长度为三个元素的列表:

library(purrr)

list(a, b) %>% transpose() %>% expand.grid()

并返回相同的内容。