R 如何组合来自不同列的数据,例如给定列周围列的平均值
我试图通过将覆盖给定列周围n列的窗口的平均值赋值来平滑矩阵。我已经设法做到了,但我想看看在使用for循环时,如何使用“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)
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()
中-或者如果您愿意使用基于循环的方法,将过滤器包装在一个循环中。谢谢,这是非常有用的。我选择了另一个正确的答案,因为它没有使用外部库。谢谢,这非常有用。我选择了另一个正确的答案,因为它没有使用外部库。