2016-10-01 13 views
2

検索の数時間後、私はあなたの専門知識に目を向けます。 Rの初心者は、自分のコードをスピードアップしようとします。私の目標は、行列Aの値を置き換えることです。しかし、別の行列Bの2つのベクトルに基づいて値を置き換えたいとします。 B[, 1]は、行列Aの行iの名前です。第2列のB[, 2]は、行列Aの列の名前に対応します。他のマトリックスでインデックスされた行列要素の置換

私のコードの最初のバージョンは、ループ内でmatch関数を使用することでした。

for(k in 1:L){ 
    i <- B[k,1] 
    j <- B[k,2] 
    d <- match(i,rownames(A)) 
    e <- match(j,colnames(A)) 
    A[d, e] <- 0 
    } 

番目のバージョンは、私は少しスピードを許可:

for(k in 1:L) { 
    A[match(B[k,1],rownames(A)), match(B[k,2],colnames(A))] <- 0 
    } 

しかし、処理時間が長すぎる、長いです。だから私はapply関数を使用すると思った。このためには、Bの各行ベクトルにapplyを使用する必要があります。

applyは素晴らしい機能を使用していますか?または私は間違った方法で行っていますか?

答えて

3

マトリックスインデックスの力を利用してA[B[, 1:2]] <- 0を簡単に実行できると思われます。例えば

A[cbind(1:4, 1:4)] <- 0は、実際には0にA[1,1]A[2,2]A[3,3]A[4,4]に置き換えられますAは「dimnames」属性を(「rownames」と「COLNAMESは」あなたはを参照してください)を持っていれば、我々はまた、文字を使用することができますインデックスとしての文字列。


再現例

A <- matrix(1:16, 4, 4, dimnames = list(letters[1:4], LETTERS[1:4])) 
# A B C D 
#a 1 5 9 13 
#b 2 6 10 14 
#c 3 7 11 15 
#d 4 8 12 16 

set.seed(0); B <- cbind(sample(letters[1:4])), sample(LETTERS[1:4])) 
#  [,1] [,2] 
#[1,] "d" "D" 
#[2,] "a" "A" 
#[3,] "c" "B" 
#[4,] "b" "C" 

## since `B` has just 2 columns, we can use `B` rather than `B[, 1:2]` 
A[B] <- 0 

# A B C D 
#a 0 5 9 13 
#b 2 6 0 14 
#c 3 0 11 15 
#d 4 8 12 0 
関連する問題