r - 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 语句之类的方法,但无法使其正常工作。
解决方案
你可以试试下面的代码
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))
推荐阅读
- html - 如何查找列表中元素的 SCSS 索引?
- dialogflow-es - Dialogflow 将图像发送回 webhook 实现
- python - Pandas 线性插值总是用相同的值替换
- java - SWT:如何在各种 RowLayout 内的所有按钮中具有相同的宽度
- vba - 错误处理程序未处理类型不匹配
- oracle - 在informatica中读取海量数据表时如何提高会话性能
- javascript - 来自 websocket API 的膨胀响应
- javascript - 在 JavaScript 范围内设置 jstl 值
- curl - 使用 curl 通过 Salesforce api 获取数据失败
- postgresql - 是否可以直接访问 PostgreSQL?