【问题标题】:For each row in a data.frame, get the standard deviation of the previous n values对于 data.frame 中的每一行,获取前 n 个值的标准差
【发布时间】:2020-08-31 16:07:18
【问题描述】:

我正在努力获得前 n 个值的标准偏差。或者在我的情况下是过去 5 天。

我以下面的代码为例:

df<- data.frame(date = seq(as.Date("2019-12-01"), as.Date("2020-03-31"), by="days"),
                TRM= runif(122, min=3500, max=4100))
> df
          date      TRM
1   2019-12-01 3540.028
2   2019-12-02 3673.536
3   2019-12-03 3827.182
4   2019-12-04 3824.791
5   2019-12-05 3906.753
6   2019-12-06 3528.100
7   2019-12-07 3650.191
# ... with more rows

然后我用mutate添加一些我需要的信息,我会告诉你最后几行:

df<-mutate(df, diferencia = TRM - lag(TRM, 1),
           VAR=diferencia/lag(TRM, 1))
>df
          date      TRM  diferencia          VAR
118 2020-03-27 3779.479 -262.366328 -0.064912515
119 2020-03-28 3773.771   -5.708207 -0.001510316
120 2020-03-29 4097.078  323.307069  0.085672159 
121 2020-03-30 3752.619 -344.459061 -0.084074332 
122 2020-03-31 3707.442  -45.176979 -0.012038788 

所以我需要的是以下内容:

  1. 为列“VAR”创建一个包含sd 的列。
  2. 每行的sd 必须仅包含“VAR”列的最后 5 天。
  3. 如果这一切都可以用dply 完成,那就太好了。 (没必要)

例如,对于第 122 行,结果将是:

 > sd(df[118:122,4])
[1] 0.06630885

所以我得到的是我的df 的所有行的这个值,我以 5 天为例,但我想修改范围:

          date      TRM  diferencia          VAR  diff5days
118 2020-03-27 3779.479 -262.366328 -0.064912515 0.05801765
119 2020-03-28 3773.771   -5.708207 -0.001510316 0.04799908
120 2020-03-29 4097.078  323.307069  0.085672159 0.06207932
121 2020-03-30 3752.619 -344.459061 -0.084074332 0.07522609
122 2020-03-31 3707.442  -45.176979 -0.012038788 0.06630885

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    您可以使用zoorollapply 函数进行滚动计算。在dplyr 中,您可以将其用作 -

    library(dplyr)
    library(zoo)
    
    df <- df %>% mutate(sd5 = rollapplyr(TRM, 5, sd, fill = NA))
    

    【讨论】:

      【解决方案2】:

      这是使用 Base R 的解决方案:

      df<- data.frame(date = seq(as.Date("2019-12-01"), as.Date("2020-03-31"), by="days"),
                      TRM= runif(122, min=3500, max=4100))
      df$stDev <- NA
      
      for(i in 5:nrow(df)) df$stDev[i] <- sd(df$TRM[(i - 4):i])
      

      ...和输出:

      > head(df,n = 10)
               date      TRM rownum     stDev
      1  2019-12-01 3553.666      1        NA
      2  2019-12-02 4054.015      2        NA
      3  2019-12-03 3976.555      3        NA
      4  2019-12-04 3825.628      4        NA
      5  2019-12-05 4036.383      5 208.01581
      6  2019-12-06 3787.414      6 122.38142
      7  2019-12-07 3886.663      7 103.45743
      8  2019-12-08 3930.801      8  97.10099
      9  2019-12-09 3626.911      9 155.10571
      10 2019-12-10 3781.731     10 117.29726
      >
      

      我们可以验证前三行的结果如下:

      > # verify first three results
      > sd(df$TRM[1:5])
      [1] 208.0158
      > sd(df$TRM[2:6])
      [1] 122.3814
      > sd(df$TRM[3:7])
      [1] 103.4574
      >
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-22
        • 2016-07-23
        • 2021-12-27
        • 2013-07-13
        • 2017-05-08
        • 2016-01-23
        • 2019-01-03
        相关资源
        最近更新 更多