R 移动矩阵子集内的计数值

R 移动矩阵子集内的计数值,r,matrix,subset,R,Matrix,Subset,说下面的矩阵 mat = round(matrix(runif(100), ncol = 5)) mat [,1] [,2] [,3] [,4] [,5] [1,] 0 1 0 1 0 [2,] 0 0 1 1 1 [3,] 1 1 1 1 1 [4,] 1 0 1 0 1 [5,] 1 0 0 1 1 [6,] 1

说下面的矩阵

mat = round(matrix(runif(100), ncol = 5))
mat
      [,1] [,2] [,3] [,4] [,5]
 [1,]    0    1    0    1    0
 [2,]    0    0    1    1    1
 [3,]    1    1    1    1    1
 [4,]    1    0    1    0    1
 [5,]    1    0    0    1    1
 [6,]    1    0    0    1    1
 [7,]    1    0    1    1    1
 [8,]    1    1    1    0    1
 [9,]    0    0    0    1    0
[10,]    0    0    0    1    1
[11,]    0    0    0    0    0
[12,]    1    1    0    0    1
[13,]    1    1    0    1    0
[14,]    1    0    1    0    1
[15,]    0    1    1    0    0
[16,]    1    1    0    1    1
[17,]    1    1    1    0    1
[18,]    1    1    1    1    1
[19,]    0    1    0    0    1
[20,]    1    1    0    0    0
我想生成一个新的矩阵,它是原始矩阵每个单元格周围3x3平方子集内的“1”数。 e、 g

我已经尝试了下面的循环,但是它没有给出我需要的

for(x in 1:(nrow(mat)-3)){
    for (y in 1:(ncol(mat)-3)){
        mat2[x,y] = sum(mat[c(x:x+2), c(y:y+2)] == 1))
}}
我需要能够将子集扩展到数据上的10x10框(>1000x1000个单元格)。任何提示都将不胜感激!谢谢

#DATA
set.seed(42)
mat = round(matrix(runif(20), ncol = 5))
mat
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    1    1    1    1
#[2,]    1    1    1    0    0
#[3,]    0    1    0    0    0
#[4,]    1    0    1    1    1
对于
i
行和
jth
列中的每个元素,获取
i-1
i+1
行和
j-1
j+1
列中矩阵中元素的总和。如果值超出范围,则根据需要替换为最小或最大索引

t(sapply(1:NROW(mat), function(i)
    sapply(1:NCOL(mat), function(j)
        sum(mat[max(1, i-1):min(NROW(mat), i+1), max(1, j-1):min(NCOL(mat), j + 1)]))))
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    4    6    5    4    2
#[2,]    5    7    6    4    2
#[3,]    4    6    5    4    2
#[4,]    2    3    3    3    2

最简单的方法是编写一个函数来获取邻域,然后求和

set.seed(42)

mat = round(matrix(runif(100), ncol = 5))
mat_sum = matrix(nrow=20, ncol=5)

for(x in seq_len(nrow(mat))) {
  for (y in seq_len(ncol(mat))) {
    mat_sum[x,y] <- sum(getNeighbors(x, y, mat))
  }
}

getNeighbors <- function(x, y, mat) {
  unlist(mat[((x-2):(x)) %% nrow(mat) + 1, ((y-2):(y)) %% ncol(mat) + 1])
}
set.seed(42)
mat=圆形(矩阵(runif(100),ncol=5))
材料和=矩阵(nrow=20,ncol=5)
适用于(x英寸序列(nrow(mat))){
对于(序列中的y(ncol(mat))){

材料和[x,y]谢谢d.b,但我没有得到与您相同的表:-/a确实没有!我忘记了runif每次都会提供一个随机数据集;-)它工作得很好!谢谢,我理解您的建议。唯一的问题是当单元格位于边上时。子集不完整,并且使用矩阵另一侧的值来完成。现在看到了吗这不是我想要的行为——我只看了右上角,没有看到它们不应该环绕,因为底部有很多零。现在修正我的答案。
set.seed(42)

mat = round(matrix(runif(100), ncol = 5))
mat_sum = matrix(nrow=20, ncol=5)

for(x in seq_len(nrow(mat))) {
  for (y in seq_len(ncol(mat))) {
    mat_sum[x,y] <- sum(getNeighbors(x, y, mat))
  }
}

getNeighbors <- function(x, y, mat) {
  unlist(mat[((x-2):(x)) %% nrow(mat) + 1, ((y-2):(y)) %% ncol(mat) + 1])
}