повторите ту же процедуру для n данных кадров в R - PullRequest
1 голос
/ 28 марта 2020

У меня проблема с процедурой в R, которую я хочу повторить для 100 равных баз данных, но относящихся к разным категориям продуктов.

Мои базы данных называются "df_01_Z0001", "df_01_Z0002", "df_01_Z0003", "df_01_Z0004", ... "df_01_Z0100". Они имеют одинаковые переменные, но, как я уже говорил, их необходимо разделять, поскольку они включают значения различных категорий продуктов. У меня есть эта процедура:

df_01_Z0001 <- sqldf("SELECT a.*, b.ln_yval 
              FROM appo_01_t_all as a
              LEFT JOIN df_01_Z0001 as b 
              on a.week=b.week")
df_01_Z0001 <- df_01_Z0001[,-2]
df_01_Z0001 <- df_01_Z0001[order(df_01_Z0001$week),]

ts_df_01_Z0001 <- ts(df_01_Z0001$ln_yval, 
                freq=52)

mod_01_Z0001 <- HoltWinters(ts_df_01_Z0001, alpha = NULL, beta = NULL, gamma = NULL, seasonal = c("additive"))

fcst_tab_01_Z0001 <- predict(mod_01_Z0001, 4, prediction.interval = FALSE)

Так что это модель holtwinters, которая отлично работает с одной базой данных, но ясно, что я не могу написать код выше для 100 раз. Идея состоит в том, что мне нужно только изменить «Z0001» с параметром и написать al oop (или я не знаю как), чтобы повторить эту процедуру для 100 баз данных. Я не знаю, как это сделать. Я попробовал несколько петель, но я не нашел решения. Спасибо за помощь

1 Ответ

1 голос
/ 28 марта 2020

Вот пример:

sql_strings <- lapply(1:100, function(x){
  paste0("SELECT a.*, b.ln_yval FROM appo_01_t_all as a LEFT JOIN df_01_Z",
         # The following line takes care of the leading zeros, assuming 4 digits are needed.
         sprintf("%04d", x), 
         " as b on a.week=b.week") 
  })

your_function <- function(string){
  df <- sqldf(string)
  df <- df[,-2]
  df <- df[order(df$week),]
  ts_df <- ts(df$ln_yval, freq=52)
  mod_01 <- HoltWinters(ts_df, alpha = NULL, beta = NULL, gamma = NULL, seasonal = c("additive"))
  fcst_tab <- predict(mod_01, 4, prediction.interval = FALSE)
  return(fcst_tab)
}

outcomes <- lapply(sql_strings, your_function)

Здесь outcomes - это список того, что ваша функция возвращает для каждой строки.

Если вам нужно сохранить каждый фрейм данных для чего-либо еще, Вы также можете разбить эту функцию на несколько частей. Например,

get_dataframes <- function(string){
  df <- sqldf(string)
  df <- df[,-2]
  df <- df[order(df$week),]
  return(df)}

get_predictions <- function(df)
  ts_df <- ts(df$ln_yval, freq=52)
  mod_01 <- HoltWinters(ts_df, alpha = NULL, beta = NULL, gamma = NULL, seasonal = c("additive"))
  fcst_tab <- predict(mod_01, 4, prediction.interval = FALSE)
  return(fcst_tab)
}

dataframes <- lapply(sql_strings, get_dataframes)
predictions <- lapply(dataframes, get_predictions)
...