我正在使用 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")
}
提前致谢
1)请注意,i+1:ncol(X)-i
无论1:ncol(X)
(i
作为i
取消的两个实例)这不太可能是您想要的。
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
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 )