我有一個包含 0 和 1 的 O = nxm 矩陣,我必須將其轉換為 M_j = nxn 維的 m 矩陣。在以下情況下,這些 M_j 矩陣中的每一個都將具有值 1: O 矩陣的第 j 列的元素 i 等于 1 & O 矩陣的第 j 列的元素 k 等于 0;否則將具有值 0。我已經設法在 R 中使用三重 for 回圈和 if 陳述句創建了一個腳本,這很容易做到這一點,但我確信必須有一種更有效的方法來做到這一點。但是,我真的想不出如何矢量化/使用 sapply/ 其他東西。有什么建議?
我的示例代碼:
o <- data.frame(s1 = c(1,0,0),
s2 = c(0,1,1),
s3 = c(1,0,1),
s4 = c(0,1,1))
#### MATRICES M (4 matrices of 3x3) ----
m <- list()
n_ocup <- nrow(o)
n_skill <- ncol(o)
for (i in 1:n_skill){
print(paste0("########### M", i, " ###########"))
temp_m <- matrix(nrow = n_ocup, ncol = n_ocup, 0)
temp_o <- o[,i]
for (j in 1:nrow(temp_m)){
for (k in 1:ncol(temp_m)){
if (temp_o[j,1]==1 & temp_o[k,1]==0){
temp_m[k,j] <- 1 #seems backwards but it's OK
}
}
}
m[[i]] <- temp_m
}
非常感謝您提前!
uj5u.com熱心網友回復:
是的,您的三重回圈可以用以下單線替換:
lapply(o, function(x) outer(x, x, function(a, b) as.numeric(b == 1 & a == 0)))
#> $s1
#> [,1] [,2] [,3]
#> [1,] 0 0 0
#> [2,] 1 0 0
#> [3,] 1 0 0
#>
#> $s2
#> [,1] [,2] [,3]
#> [1,] 0 1 1
#> [2,] 0 0 0
#> [3,] 0 0 0
#>
#> $s3
#> [,1] [,2] [,3]
#> [1,] 0 0 0
#> [2,] 1 0 1
#> [3,] 0 0 0
#>
#> $s4
#> [,1] [,2] [,3]
#> [1,] 0 1 1
#> [2,] 0 0 0
#> [3,] 0 0 0
uj5u.com熱心網友回復:
你的內部for回圈正在做一個outer:
m <- lapply(o, function(x) {outer(1 - x, x)})
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/337668.html
上一篇:回圈遍歷隨機生成的陣列的最佳方法
下一篇:計算在陣列排序之前洗掉的迭代次數
