【问题标题】:New variable in dataframe [duplicate]数据框中的新变量[重复]
【发布时间】:2014-12-17 16:24:37
【问题描述】:

我有一个时间序列价格的数据框,我希望在数据框中有一个新列,它是前 10 次价格观察的平均值。因此这个新变量必须从第 10 行开始并滚动,即观察 10 是前 10 个价格的平均值(观察 1-10),观察 11 是前 10 个价格的平均值(观察 2-11)等等.

【问题讨论】:

  • 试试看“移动平均线”,你会发现这样的问题:stackoverflow.com/questions/743812/…
  • 或者试试 library(gtools), running() 函数:例如运行(数据,宽度=10,垫=真,乐趣=平均)。 ?运行
  • 顺便说一句,欢迎您。人们总是愿意提供帮助,但你必须至少付出一点努力才能首先解决问题。有大量关于滚动平均值的信息。所以先尝试一些东西,如果你不能让它工作,给我们一个可重复的例子和你想要实现的目标,我们很乐意为你提供帮助。 stackoverflow.com/questions/5963269/…

标签: r dataframe average


【解决方案1】:
#the first 9 rows are blank
for (i in 1:9)
{
     average[i]=NA
}
for (i in 1:(length(prices)-9))
{
     average[i+9]=mean(prices[i:(i+9)])
}

【讨论】:

  • 有很多问题。首先,不要在 R 中增长向量,这对你的记忆来说很慢而且很糟糕。其次,R 中有可用的矢量化解决方案,因此无需自己实现。第三,如果您想自己做,请将所有内容包装在一个函数中,这样它就不会改变您全局工作区中的内容。
【解决方案2】:

使用来自gtools 包的running():

#dummy data
set.seed(123)
df <- data.frame(x=round(runif(12,1,10)))

require(gtools)
#get running mean starting on 10th row
df$RunningMean <- running(df$x,width = 10,pad=TRUE)
df

#output
    x RunningMean
1   4          NA
2   8          NA
3   5          NA
4   9          NA
5   9          NA
6   1          NA
7   6          NA
8   9          NA
9   6          NA
10  5         6.2
11 10         6.8
12  5         6.5

或者,如果您更喜欢一起使用 gtools 和 dplyr。同样的结果。

library(gtools); library(dplyr)
df <- data.frame(x=round(runif(12,1,10)))
df %>% mutate(RunningMean = running(x, width=10, pad=TRUE, fun=mean))

【讨论】:

    【解决方案3】:

    或者简单地使用filter,它可以让你在不加载额外包的情况下做到这一点:

    set.seed(123)
    df <- data.frame(x=round(runif(12,1,10)))
    n <- 10
    
    df <- within(df,{
      runmean <- filter(x,rep(1/n,n), sides=1)
    })
    

    另一个提示:如果您想在数据框中执行此操作,并且不想一直输入这些美元符号,请使用方便的函数within(),就像我在示例中所做的那样。不要忘记输入参数sides=1,否则您将采用以您所在值为中心的平均值(这是默认值)。

    【讨论】:

      【解决方案4】:

      您可以使用zoo(使用@KFB 的示例)。使用align 参数,您可以指定left、right 或center 为NAs 占用。

       library(zoo) 
       rollmean(df$x, k=10,na.pad=TRUE, align="right")
       #[1]  NA  NA  NA  NA  NA  NA  NA  NA  NA 6.2 6.8 6.5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-29
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-16
        • 1970-01-01
        相关资源
        最近更新 更多