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 の集合論のデータ構造と文法にアクセスできます。

3 つのベクトルが与えられると、

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 に答える