如何使用 mutate_at 将 sw_glance 应用于嵌套时间序列数据帧?
How to apply sw_glance using mutate_at to nested time-series dataframe?
我在嵌套(分组)df 上预测多个模型。如果我将 sw_glance 分别应用到每个列表列,我的问题就解决了,但是,对于我的示例,如果我应用 6 个模型,那么它要求我变异六次。我花了无数个小时,我想我快到了。为什么我不能执行下面的行并用函数带来的新值覆盖现有变量? (我在下面包含了一个代表,其中第 5 步是我卡住的地方)
models_df%<>% map(~mutate_at(.x,vars(mod_ets,mod_hw)),sw_glance)
仅举几例,列表如下:
-tidyverse 文档,其中提到对于分组变量,mutate_at
会失败,除非我添加 -group_cols()
。不行。
-purrr 文档:我尝试 pmap
传递变量列表。我尝试将 map 与 mutate_at
结合使用。我自己试了mutate_at
。我试过命名函数 (.f ...) 和匿名函数 (~..),但什么都没有
-我在这里试了几篇文章,几乎让我到了那里。
我升级到 tidyr 1.0,如果需要可以包含我的 sessionInfo()。
#1 dummy df
df=tibble(Tag=seq(as.Date("2010-01-01"),by="month", length.out = 60), gatos=sample(c("a","b"),60, replace = T), sales=runif(60))
#2 nesting
nested_df= df %>%
group_by(gatos) %>%
nest()
#3 declaring time series
ts_vector = nested_df %>%
mutate(data.ts=map(data,tk_ts,select=-Tag,start=c(2010,01),freq=12))
# Step 4: Apply models
models_df = ts_vector %>%
mutate(mod_ets = map(data.ts,ets),
mod_hw = map(data.ts,HoltWinters))
# Step 5: Apply sw_glance (Does NOT work)
models_df %<>%
map(~mutate_at(.x,vars(mod_ets,mod_hw)),sw_glance)
Error in UseMethod("tbl_vars") :
no applicable method for 'tbl_vars' applied to an object of class "character"
# This DOES work
models_df %<>%
mutate(foo_ets=map(mod_ets,sw_glance),
foo_hw=map(mod_hw,sw_glance))
我希望 mutate_at
修改现有变量而不必添加新变量。否则,如果可能的话,我将不胜感激如何一次将 sw_glance
应用于多个模型。谢谢你们。非常感谢您的帮助。
我们可以编写一个函数将sw_glance
应用于每个模型
library(tidyverse)
apply_models <- function(list_model) map(list_model, sweep::sw_glance)
并使用 mutate_at
将其应用于多个列
models_df %>% mutate_at(vars(mod_ets, mod_hw), apply_models)
# gatos data data.ts mod_ets mod_hw
# <chr> <list<df[,2]>> <list> <list> <list>
#1 b [31 × 2] <ts> <tibble [1 × 12]> <tibble [1 × 12]>
#2 a [29 × 2] <ts> <tibble [1 × 12]> <tibble [1 × 12]>
我在嵌套(分组)df 上预测多个模型。如果我将 sw_glance 分别应用到每个列表列,我的问题就解决了,但是,对于我的示例,如果我应用 6 个模型,那么它要求我变异六次。我花了无数个小时,我想我快到了。为什么我不能执行下面的行并用函数带来的新值覆盖现有变量? (我在下面包含了一个代表,其中第 5 步是我卡住的地方)
models_df%<>% map(~mutate_at(.x,vars(mod_ets,mod_hw)),sw_glance)
仅举几例,列表如下:
-tidyverse 文档,其中提到对于分组变量,mutate_at
会失败,除非我添加 -group_cols()
。不行。
-purrr 文档:我尝试 pmap
传递变量列表。我尝试将 map 与 mutate_at
结合使用。我自己试了mutate_at
。我试过命名函数 (.f ...) 和匿名函数 (~..),但什么都没有
-我在这里试了几篇文章,几乎让我到了那里。 我升级到 tidyr 1.0,如果需要可以包含我的 sessionInfo()。
#1 dummy df
df=tibble(Tag=seq(as.Date("2010-01-01"),by="month", length.out = 60), gatos=sample(c("a","b"),60, replace = T), sales=runif(60))
#2 nesting
nested_df= df %>%
group_by(gatos) %>%
nest()
#3 declaring time series
ts_vector = nested_df %>%
mutate(data.ts=map(data,tk_ts,select=-Tag,start=c(2010,01),freq=12))
# Step 4: Apply models
models_df = ts_vector %>%
mutate(mod_ets = map(data.ts,ets),
mod_hw = map(data.ts,HoltWinters))
# Step 5: Apply sw_glance (Does NOT work)
models_df %<>%
map(~mutate_at(.x,vars(mod_ets,mod_hw)),sw_glance)
Error in UseMethod("tbl_vars") :
no applicable method for 'tbl_vars' applied to an object of class "character"
# This DOES work
models_df %<>%
mutate(foo_ets=map(mod_ets,sw_glance),
foo_hw=map(mod_hw,sw_glance))
我希望 mutate_at
修改现有变量而不必添加新变量。否则,如果可能的话,我将不胜感激如何一次将 sw_glance
应用于多个模型。谢谢你们。非常感谢您的帮助。
我们可以编写一个函数将sw_glance
应用于每个模型
library(tidyverse)
apply_models <- function(list_model) map(list_model, sweep::sw_glance)
并使用 mutate_at
models_df %>% mutate_at(vars(mod_ets, mod_hw), apply_models)
# gatos data data.ts mod_ets mod_hw
# <chr> <list<df[,2]>> <list> <list> <list>
#1 b [31 × 2] <ts> <tibble [1 × 12]> <tibble [1 × 12]>
#2 a [29 × 2] <ts> <tibble [1 × 12]> <tibble [1 × 12]>