r - 按与单元格的距离 (R) 对矩阵中的向量求和
问题描述
假设我有一个A
维度矩阵n x m
。一个起始单元格和一个满足(i,j)
的常数。k
k < n x m
我需要一种方法来提取其中的值A
,以使所有值都在k
起始单元格的步骤内。一步是列移动或行移动。然后我希望将提取的值按 2 组求和,其中 1 组由从原始矩阵中的同一列获得的总和组成,另一组是从沿原始矩阵的行的值总和获得的总和。
对我来说重要的是,这解决了起始单元格k
距离矩阵边缘几步之遥的情况。示例集(我在这里非常简化):
> #create matrix where m = 7,n = 7
> Mat <- sample(1:49,49) %>% matrix(7,7)
>
> #declare starting cell where (i = 4, j = 2)
> i = 4
> j = 2
>
> #declare number of steps
> k = 2
>
> Mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 25 35 29 10 16 46 23
[2,] 32 43 7 5 31 1 14
[3,] 36 19 49 45 13 41 47
[4,] 17 18 48 9 3 28 12
[5,] 26 6 30 33 20 2 11
[6,] 40 24 39 21 37 38 8
[7,] 4 15 34 22 27 44 42
> Mat[i,j]
[1] 18
对于此示例,输出将是两个向量(一个用于列和,一个用于行和):
> Columnsum <- c(sum(36,17,26) , #sum(Mat[3:5,1])
+ sum(43,19,18,6,24), #sum(Mat[2:6,2])
+ sum(49,48,30), #sum(Mat[3:5,3])
+ sum(9)) #sum(Mat[4:4,3])
>
> Rowsum <- c(sum(43), #sum(Mat[2,2:2])
+ sum(36,19,49), #sum(Mat[3,1:3])
+ sum(17,18,48,9), #sum(Mat[4,1:4])
+ sum(26,6,30), #sum(Mat[5,1:3])
+ sum(24)) #sum(Mat[6,2:2])
>
> Columnsum
[1] 79 110 127 9
> Rowsum
[1] 43 104 92 62 24
解决方案
您可以通过使用以下内容覆盖它们,从而“删除”矩阵Mat
中的条目超过k
几步之遥的部分:(i,j)
NA
Mat[abs(row(Mat) - i) + abs(col(Mat) - j) > k] <- NA
然后删除完全是的行和列NA
:
Mat <- Mat[rowSums(is.na(Mat)) != ncol(Mat), colSums(is.na(Mat)) != nrow(Mat)]
最后,您可以计算行和列的总和:
Columnsum <- colSums(Mat, na.rm = TRUE)
Rowsum <- rowSums(Mat, na.rm = TRUE)
推荐阅读
- spring-boot - 在 Spring Boot 验证中使用 messages.properties 文件的自定义验证消息中的问题
- python - What do I need to do to dynamically import a module?
- javascript - 我在 Google 标签管理器中的变量定义有什么问题?
- postgresql - docker build 错误:psql:无法连接到服务器:连接被拒绝
- google-sheets - 汇总多张工作表中的数据
- c# - 无法使用 Interop.Outlook 发送电子邮件
- c# - 如何获取没有文件扩展名的文件名
- bash - 在 shell 脚本中分配一个变量以在脚本之外使用
- reactjs - 根据选择的选项有条件地显示材质 UI 选择(下拉)
- java-8 - 解决,不兼容类型错误,java 8