1

私はR言語で働いています。行列の上対角要素のいずれかが 0.5 より大きい場合、それを出力に出力するという条件を課したいと考えています。

次のコードを使用していますが、必要のない対角要素以外を出力します。

for(i in 1:ncol(X))

for (j in i+1:ncol(X)-i){
if(mat(X)[i,j]>0.5)

#upper.tri(cor(X),diag=F)

cat(i,",",j," th element", " > 50%","\n")
}

前もって感謝します

4

2 に答える 2

5

1) (cancel の 2 つのインスタンスとして) に関係なくi+1:ncol(X)-i等しいことに注意してください。これは、意図したものではない可能性があります。1:ncol(X)ii

2) また、これはループなしで実行できることに注意してください。

# create test matrix
set.seed(123)
m <- matrix(runif(25), 5)

# ix selects large elements
ix <- m > .5 & upper.tri(m)
s <- sprintf("\nm[%d, %d] = %f > 0.5", row(m)[ix], col(m)[ix], m[ix])

次のように表示されます。

> cat(s, "\n")

m[1, 3] = 0.956833 > 0.5 
m[1, 4] = 0.899825 > 0.5 
m[1, 5] = 0.889539 > 0.5 
m[2, 5] = 0.692803 > 0.5 
m[3, 5] = 0.640507 > 0.5 
m[4, 5] = 0.994270 > 0.5

m上記で使用されるマトリックスは次のとおりです。

> m
          [,1]      [,2]      [,3]       [,4]      [,5]
[1,] 0.2875775 0.0455565 0.9568333 0.89982497 0.8895393
[2,] 0.7883051 0.5281055 0.4533342 0.24608773 0.6928034
[3,] 0.4089769 0.8924190 0.6775706 0.04205953 0.6405068
[4,] 0.8830174 0.5514350 0.5726334 0.32792072 0.9942698
[5,] 0.9404673 0.4566147 0.1029247 0.95450365 0.6557058
于 2013-04-19T13:09:23.823 に答える
3

which()arr.indここでは、引数を使用して行列のインデックスを返すことができるはずです。考えたとおりに使用できupper.tri、追加の論理選択基準 ( > 0.5) を使用して、説明に適合する要素を見つけることができます。

set.seed(3234)
m <- matrix(runif(16),nrow=4)

m
#          [,1]       [,2]      [,3]       [,4]
#[1,] 0.24903346 0.06965592 0.8715103 0.92297359
#[2,] 0.81593852 0.99991663 0.3717652 0.67191551
#[3,] 0.85413490 0.13877853 0.7990082 0.04143296
#[4,] 0.01439058 0.27303603 0.5246000 0.08486883

which(m > 0.5 & upper.tri(m) , arr.ind = TRUE )
#    row col
#[1,]   1   3
#[2,]   1   4
#[3,]   2   4

これにはデフォルトで対角線が含まれていないことに注意してください。対角線を含めたい場合は、次のdiag=TRUEような引数を使用しますwhich(m > 0.5 & upper.tri(m , diag = TRUE) , arr.ind = TRUE )

于 2013-04-19T13:03:35.440 に答える