簡體   English   中英

在r中轉換矩陣的更快捷的方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM