我在 R 中有一個矩陣,格式如下:
x11 x12 x13
x21 x22 x23
X = x31 x32 x33
我生R成為:
set.seed(123)
X <- matrix(sample(15,9,T),3)
colnames(X) <- paste0("X",1:3)
> X
X1 X2 X3
[1,] 15 14 2
[2,] 15 3 6
[3,] 3 10 11
我想X_new使用以下函式生成一個新矩陣:
xij = xij / ( w * sqrt(xii*xjj)),
w = 1何時何地。xii=xjj_ 例如和w=2xii≠xjj(1,1)= 15 / (1*sqrt(15*15))=1(1,2)= 14/(2*sqrt(15*3))= 1,04
基本上對角線將是ones。我怎樣才能R用apply函式做到這一點?
最終結果必須是:
1 1.04 0.07
X_new = 1.11 1 0.52
0.11 0.87 1
uj5u.com熱心網友回復:
如圖使用outer:
d <- diag(X)
w <- 2 - outer(d, d, `==`)
X / (w * sqrt(outer(d, d)))
## X1 X2 X3
## [1,] 1.0000000 1.0434984 0.07784989
## [2,] 1.1180340 1.0000000 0.52223297
## [3,] 0.1167748 0.8703883 1.00000000
或使用sapply
sapply(1:3,
function(j) sapply(1:3,
function(i) X[i,j] / ((2 - (X[i, i] == X[j, j])) * sqrt(X[i,i] * X[j, j]))))
## [,1] [,2] [,3]
## [1,] 1.0000000 1.0434984 0.07784989
## [2,] 1.1180340 1.0000000 0.52223297
## [3,] 0.1167748 0.8703883 1.00000000
或不同的使用方式outer:
f <- function(i, j) X[i,j] / ((2 - (X[i, i] == X[j, j])) * sqrt(X[i,i] * X[j, j]))
outer(1:3, 1:3, Vectorize(f))
## [,1] [,2] [,3]
## [1,] 1.0000000 1.0434984 0.07784989
## [2,] 1.1180340 1.0000000 0.52223297
## [3,] 0.1167748 0.8703883 1.00000000
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/530796.html
標籤:r矩阵申请应用
上一篇:R:根據距離列計算圈數
