2

我有多个向量,我想获得这些向量的所有组合。说,我有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可以完成这项工作(需要重塑)。仲裁向量数量的情况如何?

4

2 回答 2

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))

这给了你同样的结果。

于 2013-03-19T03:25:04.960 回答
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
于 2013-03-19T03:05:34.200 回答