2

この問題は、すでに数日間私を混乱させました。2 つの行列があるとします。

matrix_a <- matrix(0, nrow = 3, ncol = 3, 
                   dimnames = list(c("r1", "r2", "r3"), c("c1", "c2", "c3")))
matrix_b <- matrix(c("r1", "r2", "c1", "c2"), nrow = 2, ncol = 2)

関数で動的に変更したいmatrix_a:

change_var <- function(x, matrix_a) {
    if(any(rownames(matrix_a) == x[1])  && any(colnames(matrix_a) == x[2])) {
        matrix_a[x[1], x[2]] <- 1
        return (matrix_a)
    }
}
apply(matrix_b, 1, change_var, matrix_a)

ただし、このコードは をまったく変更できないようmatrix_aです。しかし、私の意図した結果matrix_a

   c1 c2 c3
r1  1  0  0
r2  0  2  0
r3  0  0  0

を動的に変更するという目標をどのように達成できmatrix_aますか? ループしないソリューションを教えてください。前もって感謝します。

4

1 に答える 1

0

ご存知のように、<<-またはassign「グローバル」変数を変更するために使用できます。で呼び出すのと<<-よく似ています。assigninherits=TRUE

...しかし、matrix_b で指定されたセル座標の出現回数をカウントするマトリックスを作成しようとしているようですか? 関数を使用すると、(for ループなしで) より効率的に実行できtableます。matrix_b機能することを示すために、重複した行を追加しました。

matrix_a <- matrix(0, nrow = 3, ncol = 3, 
                   dimnames = list(c("r1", "r2", "r3"), c("c1", "c2", "c3")))
matrix_b <- matrix(c("r1", "r2", "r2", "c1", "c2", "c2"), nrow = 3, ncol = 2)
# Convert matrix_b from 2-d to 1-d indices
row <- match(matrix_b[,1], rownames(matrix_a))
col <- match(matrix_b[,2], colnames(matrix_a))
idx <- row+(col-1)*nrow(matrix_a)
# Then count the number of identical indices using table
matrix_a[sort(unique(idx))] <- table(idx)

更新対象matrix_a:

   c1 c2 c3
r1  1  0  0
r2  0  2  0
r3  0  0  0

...もちろん、そこに a を入れるだけでよい場合は1、呼び出す必要はありませんtable:

row <- match(matrix_b[,1], rownames(matrix_a))
col <- match(matrix_b[,2], colnames(matrix_a))
idx <- row+(col-1)*nrow(matrix_a)
matrix_a[idx] <- 1
于 2011-07-26T00:06:50.633 に答える