R 如何从文本文件计算移动平均值?
我有一个文本文件。我想做一些如下所示的计算(移动平均)并写出结果。文本文件包含15列和601行R 如何从文本文件计算移动平均值?,r,dataframe,zoo,lapply,moving-average,R,Dataframe,Zoo,Lapply,Moving Average,我有一个文本文件。我想做一些如下所示的计算(移动平均)并写出结果。文本文件包含15列和601行 columns <- paste0("X", 1:13) ref <- read.table("D:\\DAS_asc.txt", sep="",header=TRUE) library(zoo) mean <- lapply(columns, function(column) { rollapply(ref[[column]], 5, FUN = me
columns <- paste0("X", 1:13)
ref <- read.table("D:\\DAS_asc.txt", sep="",header=TRUE)
library(zoo)
mean <- lapply(columns, function(column) {
rollapply(ref[[column]], 5, FUN = mean,na.rm=TRUE, fill=NA) })
我想知道当我们对文本文件执行此操作时出现了什么问题
文件的前两行:
"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14"
"2" 0.0493461075417879 0.0262911450465596 0.0426611743228151 0.0954854469641096 0.0933782886825547 0.218212200747129 0.285405481705908 0.226218243796976 0.146648210899044 0.115716572518044 0.0675501818197432 0.069120070466305 0.281314574594234 0.364434947521643 0.0124844383491671
如果您想要列的移动平均值,我看不出您的代码有什么问题。如果您是指13列行的移动平均值,请在ref data.frame上使用
apply
movAvg <- t( apply( ref[,columns] , 1 , fun = function(x){ rollapply(x , width = 5, FUN = mean, na.rm=TRUE, fill=NA) } ) )
试试这个:
columns <- paste0("X", 1:13)
ref <- read.table("D:\\DAS_asc.txt", sep="",header=TRUE)
library(zoo)
movingaverages<-lapply( ref[,columns], function(column) {
rollapply(column, 5, FUN = mean,na.rm=TRUE, fill=NA) } )
#OR
movingaverages<-apply( ref[,columns], 2, function(column) {
rollapply(column, 5, FUN = mean,na.rm=TRUE, fill=NA) } )
# substract from old values:
ref[,columns]<-ref[,columns]-movingaverages
# note, movingaverages is not a data.frame
# you can convert it to such like this:
data.frame(movingaverages)
columns是的,但我在这里指定了从1到13的范围:columns您想对一列进行移动平均,还是对每行的13列进行移动平均?@JonssonSali您为什么要谈论文本文件?我认为问题只是计算data.frame中13列/变量的移动平均数。请尽量清楚并给出一个可复制的例子。你不想跨行应用吗?在原始代码中,移动平均值是针对每一列的?在这种情况下,他的原始代码会起作用。每列都作为向量传递给rollapply?如果这不是他所期望的,我想他指的是跨行滚动平均。哦,是的,可能是这样。是的,我想对每一列而不是每一行这样做。那么Hemmo:你是做专栏的?我想从ref中减去结果,所以请您更新您的解决方案,以显示如何让ref与结果相同。就像dataframe一样?
w <- 1:5
x <- 1:5
y <- 1:5
z <- 1:5
df <- data.frame( w ,x , y , z )
df
# w x y z
# 1 1 1 1 1
# 2 2 2 2 2
# 3 3 3 3 3
# 4 4 4 4 4
# 5 5 5 5 5
cols <- c( "w" , "x" , "y" , "z" )
# Rolling average across columns using list of specified columns
laply( cols , function(x){ rollapply( df[[x]] , FUN = mean , width = 2 , na.rm=TRUE, fill=NA ) })
# 1 2 3 4 5
# [1,] 1.5 2.5 3.5 4.5 NA
# [2,] 1.5 2.5 3.5 4.5 NA
# [3,] 1.5 2.5 3.5 4.5 NA
# [4,] 1.5 2.5 3.5 4.5 NA
# Which is the same as...
t( apply( df[ , cols] , 2, function(x){ rollapply( x , width = 2, FUN = mean, na.rm=TRUE, fill=NA) } ) )
# [,1] [,2] [,3] [,4] [,5]
# w 1.5 2.5 3.5 4.5 NA
# x 1.5 2.5 3.5 4.5 NA
# y 1.5 2.5 3.5 4.5 NA
# z 1.5 2.5 3.5 4.5 NA
# Rolling average across rows...
t( apply( df[,cols] , 1 , FUN = function(x){ rollapply( x , FUN = mean , width = 2 , na.rm=TRUE, fill=NA ) } ) )
columns <- paste0("X", 1:13)
ref <- read.table("D:\\DAS_asc.txt", sep="",header=TRUE)
library(zoo)
movingaverages<-lapply( ref[,columns], function(column) {
rollapply(column, 5, FUN = mean,na.rm=TRUE, fill=NA) } )
#OR
movingaverages<-apply( ref[,columns], 2, function(column) {
rollapply(column, 5, FUN = mean,na.rm=TRUE, fill=NA) } )
# substract from old values:
ref[,columns]<-ref[,columns]-movingaverages
# note, movingaverages is not a data.frame
# you can convert it to such like this:
data.frame(movingaverages)