如何计算dplyr中的滚动标准偏差

时间:2021-03-03 22:01:54

标签: r dplyr tidyverse

我在 R 中有以下数据框。

data <- structure(list(Date = structure(c(18682, 18683, 18684, 18687, 
18688), class = "Date"), Apple = c(125.349998, 120.989998, 121.260002, 
127.790001, 125.120003), Amazon = c(3159.530029, 3057.159912, 
3092.929932, 3146.139893, 3094.530029), Facebook = c(264.309998, 
254.690002, 257.619995, 264.910004, 259), Google = c(2083.810059, 
2015.949951, 2021.910034, 2069.659912, 2064.47998), Netflix = c(553.409973, 
546.700012, 538.849976, 550.640015, 547.820007)), row.names = c(NA, 
-5L), class = c("tbl_df", "tbl", "data.frame"))

我正在寻找一种简单的方法来计算 dplyr 中每一列的滚动标准偏差。如果我的数据框是动物园对象,则解决方案可能看起来像这样

library(tidyverse)
data %>% mutate_at(.vars = vars(2:6), .funs = ~zoo::rollapply(., width = 2, FUN = sd))

关于如何调整 .funs 命令以处理 tbl 对象的任何想法?

2 个答案:

答案 0 :(得分:2)

我喜欢 slider 包:

data %>%
  mutate(across(-Date, ~slider::slide_dbl(.x, sd, .before = Inf)))
  # or use `.before = 2` if you want to look back at the
  #  two prior values (3 in total)

# A tibble: 5 x 6
  Date       Apple Amazon Facebook Google Netflix
  <date>     <dbl>  <dbl>    <dbl>  <dbl>   <dbl>
1 2021-02-24 NA      NA      NA      NA     NA   
2 2021-02-25  3.08   72.4     6.80   48.0    4.74
3 2021-02-26  2.44   52.0     4.93   37.6    7.29
4 2021-03-01  3.30   47.5     5.03   34.0    6.33
5 2021-03-02  2.91   42.1     4.40   30.3    5.49

slider 还允许您按索引列调整窗口大小,因此您可以使用 slider::slide_index_dbl() 计算“过去 2 天的标准偏差”(与最近 2 次观察相比)。

答案 1 :(得分:1)

这里有几种可能性。请注意,您可能需要使用相同的参数在末尾带有 r 的 rollapplyr(表示右窗口对齐而不是中心对齐的默认值),但我们无法在没有完整解释的问题中判断是什么想要。

1a) 如果您将 fill=NA 添加到 rollapply 调用中,问题中的代码有效,尽管 mutate_at 已被弃用而支持 cross。

1b) 要使用 mutate/across,请改用它。

library(dplyr)
library(zoo)

data %>% mutate(across(-Date, ~ rollapply(., 2, sd, fill = NA)))

1c) 另一种可能性是像这样使用 %<>%:

library(magrittr)
library(zoo)

data2 <- data
data2[-1] %<>% rollapply(2, sd, fill = NA)

2) 转换为 zoo 在这种情况下代码就是这样,因为 zoo 对象不需要像数据框那样填充 NA,并且由于日期不表示为我们不需要的第一列'不需要使用特殊措施来避免申请。

library(zoo)
z <- read.zoo(data)
rollapply(z, 2, sd)
相关问题