Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用应用函数从矩阵中选择单元格窗口?_R_Matrix_Moving Average - Fatal编程技术网

R 使用应用函数从矩阵中选择单元格窗口?

R 使用应用函数从矩阵中选择单元格窗口?,r,matrix,moving-average,R,Matrix,Moving Average,给定一个矩阵: m <- matrix(rep(1:10,10),10,20) 当9个值是子集时,我希望计算每个单元格位于9个单元格窗口中心时的平均值和sd,并将这些单个值输出到新的相应矩阵(一个用于平均值,一个用于sd) 我已经使用嵌套的for循环手动完成了这项工作,但是在大型矩阵上,这是一个缓慢的过程。我还没有找到一个在行和列上都创建窗口的函数,因此我试图解决这个问题 以下是我的for循环示例: m <- matrix(rep(1:10,10),10,20) ##The num

给定一个矩阵:

m <- matrix(rep(1:10,10),10,20)
当9个值是子集时,我希望计算每个单元格位于9个单元格窗口中心时的平均值和sd,并将这些单个值输出到新的相应矩阵(一个用于平均值,一个用于sd)

我已经使用嵌套的
for
循环手动完成了这项工作,但是在大型矩阵上,这是一个缓慢的过程。我还没有找到一个在行和列上都创建窗口的函数,因此我试图解决这个问题

以下是我的
for
循环示例:

m <- matrix(rep(1:10,10),10,20)
##The number of cells on each dimension of the window
window <- 3
pad <- (window-1)/2
##Row padding
m.pad <- rbind(matrix(,pad,ncol(m)),m,matrix(,pad,ncol(m)))
##Column padding
m.pad <- cbind(matrix(,nrow(m.pad),pad),m.pad,matrix(,nrow(m.pad),pad))
##Note real data dimensions in the padded matrix
maxrow <-nrow(m.pad)-pad
maxcol <- ncol(m.pad)-pad
##Create output matrices
mean_values <- matrix(,nrow(m),ncol(m))
sd_values <-  matrix(,nrow(m),ncol(m))
##Moving window to create mean and sd
for (i in (pad+1):maxrow)
{
  for (j in (pad+1):maxcol)
  {
    ##Subset out the window into a vector, 
    ##take mean and sd and put into new matrix
    mean_values[(i-pad),(j-pad)] <- mean(as.vector(
      m.pad[(i-pad):(i+pad),(j-pad):(j+pad)]),na.rm=TRUE)
    sd_values[(i-pad),(j-pad)] <- sd(as.vector(
      m.pad[(i-pad):(i+pad),(j-pad):(j+pad)]),na.rm=TRUE)
  }
}
m这将起作用

subset_values <- do.call(rbind,lapply(1:nrow(m),function(i) t(sapply(1:ncol(m),function(j) m.pad[i:(i+2),j:(j+2)]))))
mean_values <- matrix(apply(subset_values,1,mean,na.rm=T),nrow = nrow(m),byrow = T)
sd_values <- matrix(apply(subset_values,1,sd,na.rm=T),nrow = nrow(m),byrow = T)

subset_值我了解窗口选择,但一旦你有了窗口列表(基本上是一个3x3矩阵列表),你想计算什么的平均值和sd?这是一个窗口内所有元素的平均值和sd吗(对所有窗口重复)?是的,对于每个3x3窗口,我希望从窗口中的所有9个值(忽略NAs)中获得相等的加权平均值和sd。感谢您的回答。我已经更改了问题中的可再现矩阵,以便更容易理解输出是否正确。在新矩阵上使用您的代码,后跟
out@JPD:可能我没有正确理解这个问题。您说过可以使用
for
循环来执行此操作。请分享你的预期成果好吗?那会帮我找到你。顺便说一句,这些子集是否与您想要的输出匹配?我已将我的
for
循环代码添加到问题中,您应该能够重现输出。我认为您的子集工作正常,可能只是我将代码生成的值错误地放入了矩阵?@JPD:我根据您的
m
&
m.pad
矩阵进行了更改。我想现在没事了。
subset_values <- do.call(rbind,lapply(1:nrow(m),function(i) t(sapply(1:ncol(m),function(j) m.pad[i:(i+2),j:(j+2)]))))
mean_values <- matrix(apply(subset_values,1,mean,na.rm=T),nrow = nrow(m),byrow = T)
sd_values <- matrix(apply(subset_values,1,sd,na.rm=T),nrow = nrow(m),byrow = T)