我有多个向量,我想得到这些向量的所有组合。说,我有v_1=(v_{1,1},...,v_{1,n_1}), ... , v_m=(v_{m_1,1},...,v_{m,n_m})
,我希望得到u={(u_1,...,u_m)|u_i∈v_i}
的集合。对于2个向量,outer
可以完成这项工作(需要重塑)。仲裁数量的向量如何?
答案 0 :(得分:7)
您正在寻找?expand.grid
,它会返回data.frame中的所有组合。例如:
> expand.grid(1:3, 1:2, 1)
Var1 Var2 Var3
1 1 1 1
2 2 1 1
3 3 1 1
4 1 2 1
5 2 2 1
6 3 2 1
更具程序性的方法是将其与do.call
:
do.call(expand.grid, list(1:3, 1:2, 1))
给你相同的结果。
答案 1 :(得分:5)
虽然expand.grid
提供了惯用R
方法,但此处提供了另一种选择。
您可以使用sets
包。这样就可以访问R中的集合论的数据结构和语法。
鉴于三个向量,你
library(sets)
a <- 1:2
b <- 3:4
d <- 5:6
# You can create `set` objects
as <- as.set(a)
bs <- as.set(b)
ds <- as.set(d)
as
## {1L, 2L}
要创建相应的n-tuples
,您可以使用*
as * bs *ds
## {((1L, 3L), 5L), ((1L, 3L), 6L), ((1L, 4L), 5L), ((1L, 4L), 6L), ((2L, 3L),
## 5L), ((2L, 3L), 6L), ((2L, 4L), 5L), ((2L, 4L), 6L)}
以编程方式执行此操作
vecList <- list(a, b, d)
ntuples <- Reduce(`*`,lapply(vecList, as.set))
并强制退回常规向量,在unlist
set
创建一个矩阵,其中每列是n元组的元素
sapply(ntuples,unlist)
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## [1,] 1 1 1 1 2 2 2 2
## [2,] 3 3 4 4 3 3 4 4
## [3,] 5 6 5 6 5 6 5 6