矩阵中的移动平均值 - 窗口超出范围

时间:2017-05-01 08:16:07

标签: r moving-average

我有一个简单的矩阵:

x <- seq (1:100)
matrix_A = matrix(x, ncol = 10)
matrix_A

我希望使用大小为3 x 3

的运行窗口来平均所有值

这样做的简单功能:

running_window_v1 <- function(mat.temp){

  #Create an empty matrix to store calculations in it
  mat.temp1=matrix(NA,ncol = ncol(mat.temp), nrow = nrow(mat.temp))

  for (i in (1 : (nrow(mat.temp)))){
    for (j in (1 : (ncol(mat.temp)))){
      mat.temp1[i,j] = mean (mat.temp[i - 1, j - 1],
        mat.temp[i - 1, j],
        mat.temp[i- 1, j + 1],
        mat.temp[i, j - 1],
        mat.temp[i, j],
        mat.temp[i, j + 1],
        mat.temp[i + 1, j - 1],
        mat.temp[i + 1, j], 
        mat.temp[i +1, j + 1])

    }
  }
  return(mat.temp1)
}

running_window_v1(matrix_A)

这个脚本的问题很明显,我收到错误,因为当(例如)i = 1j = 1时,我调用的是矩阵matrix_A[- 1, - 1]中不存在的值。因此,只有当我通过以下方式更改它时,函数才会起作用:

running_window_v2 <- function(mat.temp){

  #Create an empty matrix to store calculations in it
  mat.temp1=matrix(NA,ncol = ncol(mat.temp), nrow = nrow(mat.temp))

  for (i in (2 : (nrow(mat.temp)-1))){
    for (j in (2 : (ncol(mat.temp)-1))){
      mat.temp1[i,j] = mean (mat.temp[i - 1, j - 1],
                              mat.temp[i - 1, j],
                              mat.temp[i- 1, j + 1],
                              mat.temp[i, j - 1],
                              mat.temp[i, j],
                              mat.temp[i, j + 1],
                              mat.temp[i + 1, j - 1],
                              mat.temp[i + 1, j], 
                              mat.temp[i +1, j + 1])

    }
  }
  return(mat.temp1)
}


> running_window_v2(matrix_A)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA
 [2,]   NA    1   11   21   31   41   51   61   71    NA
 [3,]   NA    2   12   22   32   42   52   62   72    NA
 [4,]   NA    3   13   23   33   43   53   63   73    NA
 [5,]   NA    4   14   24   34   44   54   64   74    NA
 [6,]   NA    5   15   25   35   45   55   65   75    NA
 [7,]   NA    6   16   26   36   46   56   66   76    NA
 [8,]   NA    7   17   27   37   47   57   67   77    NA
 [9,]   NA    8   18   28   38   48   58   68   78    NA
[10,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA

对于我的工作,非常重要的是我不会丢失信息,我需要平均边缘(当然,使用较少的数字)。你有任何建议吗,我如何修改函数running_window_v1以便我工作正常? 我知道我可以为每个可能的边缘编写附加条件,但我正在寻找更优雅的条件。

1 个答案:

答案 0 :(得分:1)

你可以在每个循环中执行类似下面的操作(而不是单独列出所有元素,这里更容易使用索引的范围)

df.groupby('Gender').count()