对 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)
我想对 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)