首页 > 解决方案 > R:根据另一个矩阵中的值和坐标将值分配给新矩阵

问题描述

我有一个对称矩阵m1,我想m2根据 中的值和位置创建第二个矩阵m1

例如(为糟糕的伪代码道歉):

> m1
      [,1] [,2] [,3] [,4] [,5]
[1,]    0    1    2    3    4
[2,]    1    0    5    6    7
[3,]    2    5    0    8    1
[4,]    3    6    8    0    9
[5,]    4    7    1    9    0

如果值在位置(x1-3 和 y4-5)或(x4-5 和 y1-3),并且如果值本身 >2,则为“A”,否则如果它在这些位置但 <3 则“B”,否则如果是 (x1-3 和 y1-3) 或 (x4-5 和 y4-5) 且 >2 则为“C”,否则为“D”。如果可能的话,忽略对角线。

以便:

> m2
      [,1] [,2] [,3] [,4] [,5]
[1,]    NA   D    D    A    A
[2,]    D    NA   C    A    A
[3,]    D    C    NA   A    B
[4,]    A    A    A    NA   C
[5,]    A    A    B    C    NA

无论位置如何,我都可以使用m2 <- ifelse(m1 >2 , "A", "B")所有值,但是对于如何仅针对某些位置进行操作,我感到很困惑。我也尝试过诸如m1[1:3,4:5]嵌套 if 语句之类的方法,但无法使其正常工作。

标签: rmatrix

解决方案


你可以试试下面的代码

idxc <- col(m1)
idxr <- row(m1)
msk <- idxr %in% 1:3 & idxc %in% 1:3 | idxr %in% 4:5 & idxc %in% 4:5
m1[msk] <- ifelse(m1>2,"C","D")[msk]
m1[!msk] <- ifelse(m1>2,"A","B")[!msk]
m2 <- `diag<-`(m1,NA)

这使

> m2
     [,1] [,2] [,3] [,4] [,5]
[1,] NA   "D"  "D"  "A"  "A" 
[2,] "D"  NA   "C"  "A"  "A" 
[3,] "D"  "C"  NA   "A"  "B" 
[4,] "A"  "A"  "A"  NA   "C" 
[5,] "A"  "A"  "B"  "C"  NA 

数据

> dput(m1)
structure(c(0L, 1L, 2L, 3L, 4L, 1L, 0L, 5L, 6L, 7L, 2L, 5L, 0L, 
8L, 1L, 3L, 6L, 8L, 0L, 9L, 4L, 7L, 1L, 9L, 0L), .Dim = c(5L, 
5L))

推荐阅读