【问题标题】:Create all possible combinations from two values for each element in a vector in R [duplicate]从R中向量中每个元素的两个值创建所有可能的组合[重复]
【发布时间】:2023-03-12 20:36:01
【问题描述】:

我一直在尝试创建向量,其中每个元素可以采用两个不同向量中存在的两个不同值。
例如,如果有两个向量 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 循环,这些循环也会随着最终向量的元素数量线性增加。

【问题讨论】:

  • expand.grid(Map(c, a, b)) 或者更透明,library(purrr) ; list(a, b) %&gt;% transpose() %&gt;% expand.grid()
  • @alistaire - 你应该把它作为答案 - 第一个非常聪明和简洁。

标签: r loops


【解决方案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 将做同样的事情,从长度为 3 的两个元素的列表翻转到三个元素的列表长度为二:

library(purrr)

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

并返回相同的东西。

【讨论】:

    【解决方案2】:

    我认为您正在寻找的是 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
    

    【讨论】:

    • 是的,但是你需要传递成对的元素,所以最终的调用是expand.grid(c(6, 12), c(2, 5), c(9, 15))(但最好没有硬编码)。
    猜你喜欢
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多