【问题标题】:group_by and coercing to time series dplyr rgroup_by 并强制转换为时间序列 dplyr r
【发布时间】:2017-07-14 03:50:16
【问题描述】:

我有一个data.frame:

df <- data.frame(region = rep(c("a","b","c","d"),12),
                 group = rep(c("A","A","A","B","B","B","C","C","C","D","D","D"),12), 
                 num = rep(c(1:12),12))

我想按地区分组,然后按组分组,然后将 num 强制转换为时间序列对象 - 我正在这样做:

df %>%
  group_by(region,group) %>%
  mutate(num = ts(num,f=4))

它有效,但我收到一大堆警告,内容如下:

12: In mutate_impl(.data, dots) :
Vectorizing 'ts' elements may not preserve their attributes

实际上,我将其应用于大型 data.frame 并需要分解时间序列数据。在我的简化示例中,我正在使用 stl 这样做:

df %>% 
group_by(region,group) %>%
mutate(num = ts(num,f=4)) %>% 
mutate(trendcycle(stl(num, s.window = "per")))

但我收到一条错误消息:

Error in mutate_impl(.data, dots) : 
Evaluation error: series is not periodic or has less than two periods.

我猜这与试图将数据强制转换为 ts 格式有关。问题是,我以前可以毫无问题地做到这一点。

我正在使用 R 3.4.1 和 dplyr 0.7.1

【问题讨论】:

  • 我通过将 ts 转换包含在一个 mutate 调用中解决了这个问题,如下所示: df %>% group_by(region,group) %>% mutate(trendcycle(stl(ts(num,f =4), s.window = "每"))))
  • 您可以将其作为解决方案发布

标签: r dplyr


【解决方案1】:

我通过将 ts 转换包含在一个 mutate 调用中解决了这个问题,如下所示:

df %>%
group_by(region,group) %>%
mutate(trendcycle(stl(ts(num,f=4), s.window = "per")))

我是通过用 data.table 解决问题来的:

df1 <- setDT(df)[,trendcycle(stl(ts(num, frequency = 4), s.window ="per")), by = .(region,group)]

哪个更快,但我的程序遵循 tidyverse 语法,所以我保持一致

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多