Как применить sw_glance с помощью mutate_at к вложенному фрейму данных временных рядов? - PullRequest
2 голосов
/ 29 сентября 2019

Я прогнозирую несколько моделей на вложенной (сгруппированной) df.Моя проблема решается, если я применяю sw_glance к каждому столбцу списка отдельно, но, например, если я применяю 6 моделей, он просит меня мутировать шесть раз.Я провел бесчисленные часы, и я думаю, что я почти там.Почему я не могу сделать строку ниже и перезаписать существующие переменные новыми значениями, которые приносит функция?(Я включил представленный ниже пример, где шаг 5 - то, где я застреваю)что для сгруппированных переменных mutate_at потерпит неудачу, если я не добавлю -group_cols().Нет.

-purrr документация: я попытался pmap передать список переменных.Я пробовал карту в сочетании с 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 к нескольким моделям за один раз.Спасибо вам, ребята.Я очень ценю вашу помощь.

1 Ответ

1 голос
/ 30 сентября 2019

Мы можем написать функцию для применения 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]>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...