4

私は3つの異なる行列を持っています:

m1, which has 12 rows and 5 columns;
m2, which has 12 rows and 4 columns; and
m3, which has 12 rows and 1 column.

これから、一連の 3 列の行列 (p1 から p20 まで) を作成しようとしています。各 p 行列は次のようになります。

p[,1] is taken from m1,
p[,2] is taken from m2, and
p[,3] is taken from m3.

20 の可能な 3 列の行列をすべて作成するように、プロセスを徹底的にしたいので、m1、m2、および m3 のサンプリング (既に試したソリューション) は機能しないようです。

私は半ダースの異なる for ループを試しましたが、どれも私が望むものを達成することはできず、いくつかの順列関数で遊んでいましたが、このコンテキストでそれらを機能させる方法を理解できませんでした.

最終的に、私は不明な数の入力行列に対してこれを実行しようとしています。私はまだ R に慣れていないので、どこから始めればよいかについて他に考えがありません。フォーラムが提供できるヘルプは大歓迎です。

4

2 に答える 2

6
## Example matrices
m1 <- matrix(1:4, nrow=2)
m2 <- matrix(1:6, nrow=2)
m3 <- matrix(1:2, nrow=2)

## A function that should do what you're after
f <- function(...) {
    mm <- list(...)
    ii <- expand.grid(lapply(mm, function(X) seq_len(ncol(X))))
    lapply(seq_len(nrow(ii)), function(Z) {
        mapply(FUN=function(X, Y) X[,Y], mm, ii[Z,])
    })
}

## Try it out
f(m1)
f(m1,m2)
f(m1,m2,m3)
于 2013-03-19T23:15:01.957 に答える
1

あなたの問題は2つの部分に分割できるようです:

  1. 1:5、1:4、および 1 のすべての有効なインデックスの組み合わせを作成します

  2. 行列を計算する

最初の問題については、共通の列を使用しないマージ (「クロス結合」とも呼ばれます) を検討してください。

merge(data.frame(a=1:5), data.frame(a=1:4), by=c())

ループを使用して、必要な大きさのデータ フレームを作成します。編集:またはexpand.grid、ジョシュが提案したように、単に使用します。

2 番目の問題については、パッケージのalply関数が役立ちます。plyr行列/データ フレームを行ごとに処理し、結果をリスト (この場合は行列のリスト) に収集できます。

alply(combinations, 1, function(x) { ... })

combinationsなどで生成されたデータフレームexpand.gridです。この関数は、インデックスの組み合わせごとに 1 回呼び出されx、1 行のデータ フレームが含まれます。その関数の戻り値はリストに集められます。

于 2013-03-19T23:19:26.673 に答える