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)