複数のベクトルがあり、これらのベクトルのすべての組み合わせを取得したいと考えています。たとえば、私は持っていて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 に答える
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 に答える