R 如何组合来自不同列的数据,例如给定列周围列的平均值

R 如何组合来自不同列的数据,例如给定列周围列的平均值,r,matrix,smoothing,R,Matrix,Smoothing,我试图通过将覆盖给定列周围n列的窗口的平均值赋值来平滑矩阵。我已经设法做到了,但我想看看在使用for循环时,如何使用“R方式”来做到这一点。有没有一种方法可以使用apply或同一系列的某些函数来实现这一点 例如: # create a toy matrix mat <- matrix(ncol=200); for(i in 1:100){ mat <- rbind(mat,sample(1:200, 200) )} # quick visualization image(t(mat)

我试图通过将覆盖给定列周围n列的窗口的平均值赋值来平滑矩阵。我已经设法做到了,但我想看看在使用for循环时,如何使用“R方式”来做到这一点。有没有一种方法可以使用
apply
或同一系列的某些函数来实现这一点

例如:

# create a toy matrix
mat <- matrix(ncol=200);
for(i in 1:100){ mat <- rbind(mat,sample(1:200, 200) )}
# quick visualization
image(t(mat))
}

现在,我们使用
平滑行\u mat()
mat

mat.smooth <- smooth_mat(mat)

mat.smooth以下是我如何使用
graster
软件包实现的

首先,创建一个包含随机数据的矩阵,并将其强制为
光栅对象

library(raster)
r <- raster(matrix(sample(200, 200*200, replace=TRUE), nc=200))
plot(r)

下面是我如何使用
光栅
软件包来实现这一点

首先,创建一个包含随机数据的矩阵,并将其强制为
光栅对象

library(raster)
r <- raster(matrix(sample(200, 200*200, replace=TRUE), nc=200))
plot(r)

您可以在矩阵的每一行应用过滤器(运行平均值),如下所示:

apply(k, 1, filter, rep(1/k.d, k.d))
您可以对矩阵的每一行应用过滤器(运行平均值),如下所示:

apply(k, 1, filter, rep(1/k.d, k.d))

apply
只是一个“漂亮的”
循环吗?我认为在性能方面存在一些重要的差异。请参见这里的
apply
是否只是一个“漂亮的”
循环?我认为在性能方面存在一些重要的差异。看这里,为什么这会起作用?它只是对整行应用相同的过滤器,而不是基于行的实际内容。我没有得到什么吗?我现在明白过滤器在做什么了。我犯了一个错误,将其应用于重复多次的相同数字的时间序列,因此没有差异。它是一个时间序列意义上的过滤器-
apply
将获取行的内容,并有效地调用
过滤器(contentsOfRow,rep(1/k.d,k.d))
filter
获取行中的每个内容窗口(与第二个参数的长度相同),并生成该窗口中元素的加权和-我给了它相等的权重,因此它将是一个窗口平均值。我现在了解了
filter
是如何工作的,尽管它与apply一起使用时会产生奇怪的结果。具体地说,它是对矩阵的转置。过滤后的行将转换为列。为什么会发生这种情况?在帮助页面中:如果每次调用“FUN”都返回一个长度为“n”的向量,那么“apply”将返回一个维数为“c(n,dim(X)[MARGIN])的数组-因此,如果您想要基于应用的结果,只需将其包装在一个
t()
中-或者如果您更愿意使用基于循环的方法,将
过滤器包装在一个循环中。为什么这样做?它只是对整行应用相同的过滤器,而不是基于行的实际内容。我没有得到什么吗?我现在明白过滤器在做什么了。我犯了一个错误,将其应用于重复多次的相同数字的时间序列,因此没有差异。它是一个时间序列意义上的过滤器-
apply
将获取行的内容,并有效地调用
过滤器(contentsOfRow,rep(1/k.d,k.d))
filter
获取行中的每个内容窗口(与第二个参数的长度相同),并生成该窗口中元素的加权和-我给了它相等的权重,因此它将是一个窗口平均值。我现在了解了
filter
是如何工作的,尽管它与apply一起使用时会产生奇怪的结果。具体地说,它是对矩阵的转置。过滤后的行将转换为列。为什么会发生这种情况?在帮助页面中:如果每次调用'FUN'都返回长度为'n'的向量,那么'apply'将返回一个维数为'c(n,dim(X)[MARGIN])的数组-因此,如果您想要基于应用的结果,只需将其包装在一个
t()
中-或者如果您愿意使用基于循环的方法,将
过滤器包装在一个循环中。谢谢,这是非常有用的。我选择了另一个正确的答案,因为它没有使用外部库。谢谢,这非常有用。我选择了另一个正确的答案,因为它没有使用外部库。