【问题标题】:How to calculate moving average from text file?如何从文本文件计算移动平均值?
【发布时间】:2013-03-15 10:54:26
【问题描述】:

我有一个文本文件。我想做一些如下所示的计算(移动平均)并写出结果。该文本文件包含 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 = mean,na.rm=TRUE, fill=NA) })

当我刚刚输入“mean”查看结果时,我发现计算不正确(我手动进行了检查!)。我认为这可能是 moveave 函数本身,但我检查并运行良好:

s=c(1,5,2,4)
rollapply(s, 2, FUN = mean,na.rm=TRUE, fill=NA)
[1] 3.0 3.5 3.0  NA
rollapply(s, 3, FUN = mean,na.rm=TRUE, fill=NA)
[1]       NA 2.666667 3.666667       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

【问题讨论】:

  • 是的,但我在这里指定了 1 到 13:columns &lt;- paste0("X", 1:13)
  • 您要移动一列的移动平均线,还是每行 13 列的移动平均线?
  • @JonssonSali 为什么你在谈论文本文件?我认为问题只是计算 data.frame 的 13 列/变量的移动平均值。请尽量清楚并提供可重复的示例。

标签: r dataframe zoo lapply moving-average


【解决方案1】:

如果您想要列的移动平均值,我看不出您的代码有问题。如果您的意思是跨 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) } ) )

你应该得到一个数组,它的每一列是指定列的每一行 ref 的移动平均值。我使用t() 将其转回行。

差异的虚拟示例

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  ) } ) )

【讨论】:

    【解决方案2】:

    试试这个:

    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)
    

    编辑:OP 想从旧值中减去结果。

    【讨论】:

    • 不想跨行应用吗?
    • 在原始代码中,移动平均线是针对每一列的?
    • 在这种情况下,他的原始代码会起作用。每列都作为向量传递给rollapply?如果这不是他所期望的,我认为他的意思是跨行滚动平均值。
    • 哦,是的,可能是这样。
    • 是的,我想对每一列而不是每一行都这样做。所以 Hemmo:youe 与列一起工作?我想从 ref 中减去结果,所以请您更新您的解决方案以显示如何让 ref 与 results.just as dataframe 相同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2015-05-03
    • 2014-04-27
    相关资源
    最近更新 更多