我有一个简单的矩阵:
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 = 1
,j = 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
以便我工作正常?
我知道我可以为每个可能的边缘编写附加条件,但我正在寻找更优雅的条件。
答案 0 :(得分:1)
你可以在每个循环中执行类似下面的操作(而不是单独列出所有元素,这里更容易使用索引的范围)
df.groupby('Gender').count()