我一直在尝试创建向量,其中每个元素可以在两个不同的向量中存在两个不同的值 例如,如果有两个向量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循环,这也会随着最终向量的元素数量线性增加。
答案 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中向量的快捷方法是Map
,lapply
的多变量版本,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
让您感到困惑,如果您将a
和b
放入列表中,purrr::transpose
将执行相同的操作,请从两个元素的列表中翻转长度为三的长度为三个元素的列表:
library(purrr)
list(a, b) %>% transpose() %>% expand.grid()
并返回相同的内容。