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