3

他のマトリックスの値がいくつかの基準を満たしている場合、マトリックス内の要素ごとに操作を実行しようとしています。for行と列を使用してループで解決する方法は知っていますが、Rでそれを行うより効率的な方法があると確信しています。試してみましたが、要素を調べてその値を確認するapply(...,c(1,2),FUN)方法がわかりませんcond:

m <- matrix(rnorm(9),3,3)
cl <- c('a','b','c')
cond <- matrix(sample(cl,9,replace=T),3,3)
res.m <- apply(m, c(1,2), function(x) if (cond == 'a' ) { x*10 } if (cond == 'b' ) { x*-10 } else  { 0 }
4

2 に答える 2

2

これを試すことができます:

m[conda] <- m[conda <- cond == 'a'] * 10
m[condb] <- m[condb <- cond == 'b'] * -10
m[!conda & !condb] <- 0
于 2013-09-06T09:03:00.040 に答える
2

これはかなり簡単な方法です。名前付きベクターを使用して条件を設定します。

まず、私が扱っているデータは次のとおりです。

set.seed(1)
m <- matrix(rnorm(9),3,3)
cl <- c('a','b','c')
cond <- matrix(sample(cl,9,replace=T),3,3)
m
#            [,1]       [,2]      [,3]
# [1,] -0.6264538  1.5952808 0.4874291
# [2,]  0.1836433  0.3295078 0.7383247
# [3,] -0.8356286 -0.8204684 0.5757814

cond
#      [,1] [,2] [,3]
# [1,] "b"  "a"  "a" 
# [2,] "c"  "b"  "b" 
# [3,] "c"  "a"  "a"

第二に、1 つの素晴らしいコンパクトなラインでのソリューションです。

m * c(a = 10, b = -10, c = 0)[cond]
#          [,1]      [,2]      [,3]
# [1,] 6.264538 15.952808  4.874291
# [2,] 0.000000 -3.295078 -7.383247
# [3,] 0.000000 -8.204684  5.757814

基本的に、c(a = 10, b = -10, c = 0)[cond]は「cond」行列を使用して、元の行列を乗算するために使用できるベクトルを作成します。

于 2013-09-06T09:55:10.647 に答える