gpt4 book ai didi

r - 在 r 中转换矩阵的更快方法?

转载 作者:行者123 更新时间:2023-12-04 23:51:31 25 4
gpt4 key购买 nike

我正在尝试根据各种规则转换矩阵。

取这个矩阵,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

关于r - 在 r 中转换矩阵的更快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25953152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com