R中是否有另外一个类似外部的函数用于多个向量

时间:2013-03-19 03:01:17

标签: r

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

2 个答案:

答案 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