[英]Quicker way of transforming matrices in r?
我正在嘗試根據各種規則變換矩陣。
取這個矩陣,m:
x<-c(NA,0,0,0,0,0,4,NA,0,0,1,1,0,0,NA,0,2,4,4,1,3,NA,2,3,0,1,2,0,NA,1,0,0,0,0,0,NA)
m<-matrix(x,6,6, byrow=T)
rownames(m)<-colnames(m)<-LETTERS[1:6]
m
# A B C D E F
#A NA 0 0 0 0 0
#B 4 NA 0 0 1 1
#C 0 0 NA 0 2 4
#D 4 1 3 NA 2 3
#E 0 1 2 0 NA 1
#F 0 0 0 0 0 NA
轉換規則如下:
1)對角線應保持NA。
2)對於m [i,j]> m [j,i]的所有實例,則m [i,j]的值為'1',而m [j,i]的值為0。
3)對於m [i,j] == m [j,i]且都不等於0的所有實例,則m [i,j]和m [j,i]都應分配為0.5
4)當m [i,j]和m [j,i]都等於0時,它們中的一個應隨機獲得'1',而另一個應隨機獲得'0'。
我可以通過這個計算來完成步驟1-3:
m1 <- (m > t(m))+0 + (((m == t(m)) & (m!=0 & t(m)!=0)) + 0)/2
m1
這使:
# A B C D E F
#A NA 0.0 0.0 0 0.0 0
#B 1 NA 0.0 0 0.5 1
#C 0 0.0 NA 0 0.5 1
#D 1 1.0 1.0 NA 1.0 1
#E 0 0.5 0.5 0 NA 1
#F 0 0.0 0.0 0 0.0 NA
現在,我需要執行步驟4。可以在以下矩陣中找到m1 [i,j]和m1 [j,i]都等於0的實例:
(m1==0 & t(m1)==0)
# A B C D E F
# A NA FALSE TRUE FALSE TRUE TRUE
# B FALSE NA TRUE FALSE FALSE FALSE
# C TRUE TRUE NA FALSE FALSE FALSE
# D FALSE FALSE FALSE NA FALSE FALSE
# E TRUE FALSE FALSE FALSE NA FALSE
# F TRUE FALSE FALSE FALSE FALSE NA
這表明實例是AC / CA,AE / EA,AF / FA,BC / CB。
我正在尋找的輸出示例:
# A B C D E F
#A NA 0.0 1.0 0 0.0 0
#B 1 NA 1.0 0 0.5 1
#C 0 0.0 NA 0 0.5 1
#D 1 1.0 1.0 NA 1.0 1
#E 1 0.5 0.5 0 NA 1
#F 1 0.0 0.0 0 0.0 NA
我知道可以為上三角和下三角都分配相同的值,例如,此代碼中的NA: m1[((m1==0 & t(m1)==0))] <- NA
,但不確定這里有什么意義。 我還可以將矩陣融為成對的列表,並進行冗長的求解-但是這樣做的目的是運行數千個仿真,因此速度非常非常重要。
任何指導贊賞。
也許這比它需要的更復雜,但它有效並且它都是矢量化的:
i <- m1==0 & t(m1)==0 & lower.tri(m1)
m1[i] <- sample(0:1, sum(i), replace = TRUE)
m1[t(i)] <- 1 - m1[i][order(row(i)[i], col(i)[i])]
編輯:這是第二種使用矩陣索引的方法,可能稍微復雜一些:
i <- which(m1==0 & t(m1)==0 & lower.tri(m1), TRUE)
z <- sample(0:1, nrow(i), replace = TRUE)
m1[i[, 1:2]] <- z
m1[i[, 2:1]] <- 1 - z
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.