对 R 中的 n 个数据帧重复相同的过程

repeat same procedure for n dataframes in R

我想对 100 个相同但涉及不同类别产品的数据库重复 R 中的过程时遇到问题。

我的数据库命名为 "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" 并编写一个循环(或者我不知道如何),以便对 100 个数据库重复此过程。我不知道该怎么做。我尝试了一些循环,但没有找到解决方案。 谢谢你的帮助

举个例子:

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 是每个字符串的函数列表 returns。

如果您需要保留每个数据框用于其他用途,您也可以将该功能分解为多个部分。例如,

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)