循环期间的 R rbind
R rbind during loop
此代码适用于所有...除了末尾的 rbind 部分。我想从循环中获取结果并将它们组合到一个预测数据框中。我试图创建一个空的临时数据框(我正在预测 12 个季度),但出现 "not equally sized" 错误。
有人可以帮帮我吗?我快到了:-)
# Create actual data frame
Data_act <- subset(Data,Data$Type=="Actual")
# Create forecast frame with descriptive columns
Data_fc <- subset(Data[1:5],Data$Type=="Forecast")
# Create empty data frame for forecast results
Data_fc2 <- subset(Data[,6:9],Data$Type=="Forecast")
Data_fc2 <- Data_fc2[1:12,]
Data_fc3 <- Data_fc2 # temp table for loop
# Create list of unique forecast names
UniqueList <- unique(Data_act$forecast_name)
# Loop through unique list of forecast names
for(i in 1:length(UniqueList)){
# Subset data for forecast name
df <- subset(Data_act,Data_act$forecast_name==UniqueList[i])
# Create time series objects
dftsunits <- ts(df$Units,start = c(2015,1),frequency = 4)
dftsasp <- ts(df$ASP,start = c(2015,1),frequency = 4)
# Train forecasting models (Holt-Winters and ARIMA)
FC_Units_HW <- hw(dftsunits,h=12)
FC_Units_Arima <- auto.arima(dftsunits,lambda = 0) #lambda = 0 prevents negative forecasts
FC_ASP_HW <- hw(dftsasp,h=12)
FC_ASP_Arima <- auto.arima(dftsasp,lambda = 0)
# Forecast models for 12 quarters
FC_Units_HW2 <- forecast(FC_Units_HW,h=12)
FC_Units_Arima2 <- forecast(FC_Units_Arima,h=12)
FC_ASP_HW2 <- forecast(FC_ASP_HW,h=12)
FC_ASP_Arima2 <- forecast(FC_ASP_Arima,h=12)
# Save results
Data_fc3$Units_HW <- FC_Units_HW2$mean
Data_fc3$Units_ARIMA <- FC_Units_Arima2$mean
Data_fc3$ASP_HW <- FC_ASP_HW2$mean
Data_fc3$ASP_ARIMA <- FC_ASP_Arima2$mean
# Add results to master result data frame
Data_fc2 <= rbind(Data_fc2,Data_fc3)
}
解决此问题的一种快速方法是不要在循环外初始化空数据帧(即第 7-10 行),而是在循环内包含一个 if 语句来检查它是否是第一次迭代(即如果我 == 1).如果是 - 不要执行 rbind,但如果不是,则执行 rbind。这样的事情可能会奏效:
if (i == 1) {
data_out <- Data_fc3
} else {
data_out <- rbind(data_out, Data_fc2)
}
谢谢 Gregor 找出我的语法错误!虽然我的代码现在有效......但它仍然非常低效。我很想知道在循环中组合数据的最佳方法是什么。
干杯!
Data_fc2 <- rbind(Data_fc2,Data_fc3)
考虑 by
通过唯一分组对数据进行子集化,以构建一个 list 数据帧 rbind
once 在循环外。下面分配了一个通用的用户定义方法,该方法输入和输出子集数据帧并将其传递给 by
:
# Create actual data frame
Data_act <- subset(Data, Type=="Actual")
# Create empty data frame for forecast results
Data_fc <- subset(Data[1:12,6:9], Type=="Forecast")
# GENERALIZED METHOD
proc_forecast <- function(sub_df) {
# Create time series objects
dftsunits <- ts(sub_df$Units, start = c(2015,1), frequency = 4)
dftsasp <- ts(sub_df$ASP, start = c(2015,1), frequency = 4)
# Train forecasting models (Holt-Winters and ARIMA)
FC_Units_HW <- hw(dftsunits, h=12)
FC_Units_Arima <- auto.arima(dftsunits, lambda = 0)
FC_ASP_HW <- hw(dftsasp, h=12)
FC_ASP_Arima <- auto.arima(dftsasp, lambda = 0)
# Forecast models for 12 quarters and save results to new columns
sub_df <- within(Data_fc, {
Units_HW <- forecast(FC_Units_HW, h=12)$mean
Units_ARIMA <- forecast(FC_Units_Arima, h=12)$mean
ASP_HW <- forecast(FC_ASP_HW, h=12)$mean
ASP_ARIMA <- forecast(FC_ASP_Arima, h=12)$mean
})
return(sub_df)
}
# BY CALL
df_list <- by(Data_act, Data_act$forecast_name, proc_forecast)
# FINAL DF BUILD
final_df <- do.call(rbind, df_list)
final_df <- cbind(subset(Data[1:5], Type=="Forecast"), final_df)
final_df <- rbind(Data_act, final_df)
此代码有效。我很想知道如何提高效率。我需要在实际之后附加预测。
# Create actual data frame
Data_act <- subset(Data,Data$Type=="Actual")
# Create forecast frame with descriptive columns
Data_fc <- subset(Data[1:5],Data$Type=="Forecast")
# Create empty data frame for forecast results
Data_fc2 <- subset(Data[,6:9],Data$Type=="Forecast")
Data_fc2 <- Data_fc2[1:12,]
Data_fc3 <- Data_fc2 # temp table for loop
# Create list of unique forecast names
UniqueList <- unique(Data_act$forecast_name)
# Loop through unique list of forecast names and run time series
for(i in 1:length(UniqueList)){
# Subset data for forecast name
df <- subset(Data_act,Data_act$forecast_name==UniqueList[i])
# Create time series objects
dftsunits <- ts(df$Units,start = c(2015,1),frequency = 4)
dftsasp <- ts(df$ASP,start = c(2015,1),frequency = 4)
# Train forecasting models (Holt-Winters and ARIMA)
FC_Units_HW <- hw(dftsunits,h=12)
FC_Units_Arima <- auto.arima(dftsunits,lambda = 0) #lambda = 0 prevents negative forecasts
FC_ASP_HW <- hw(dftsasp,h=12)
FC_ASP_Arima <- auto.arima(dftsasp,lambda = 0)
# Forecast models for 12 quarters
FC_Units_HW2 <- forecast(FC_Units_HW,h=12)
FC_Units_Arima2 <- forecast(FC_Units_Arima,h=12)
FC_ASP_HW2 <- forecast(FC_ASP_HW,h=12)
FC_ASP_Arima2 <- forecast(FC_ASP_Arima,h=12)
# Save results
Data_fc3$Units_HW <- FC_Units_HW2$mean
Data_fc3$Units_ARIMA <- FC_Units_Arima2$mean
Data_fc3$ASP_HW <- FC_ASP_HW2$mean
Data_fc3$ASP_ARIMA <- FC_ASP_Arima2$mean
# Add results to master result data frame
Data_fc2 <- rbind(Data_fc2,Data_fc3)
}
Data_fc2 <- na.omit(Data_fc2)# Remove original 12 empty rows
Data_fc <- cbind(Data_fc,Data_fc2)
Data_Final <- rbind(Data_act,Data_fc)
此代码适用于所有...除了末尾的 rbind 部分。我想从循环中获取结果并将它们组合到一个预测数据框中。我试图创建一个空的临时数据框(我正在预测 12 个季度),但出现 "not equally sized" 错误。
有人可以帮帮我吗?我快到了:-)
# Create actual data frame
Data_act <- subset(Data,Data$Type=="Actual")
# Create forecast frame with descriptive columns
Data_fc <- subset(Data[1:5],Data$Type=="Forecast")
# Create empty data frame for forecast results
Data_fc2 <- subset(Data[,6:9],Data$Type=="Forecast")
Data_fc2 <- Data_fc2[1:12,]
Data_fc3 <- Data_fc2 # temp table for loop
# Create list of unique forecast names
UniqueList <- unique(Data_act$forecast_name)
# Loop through unique list of forecast names
for(i in 1:length(UniqueList)){
# Subset data for forecast name
df <- subset(Data_act,Data_act$forecast_name==UniqueList[i])
# Create time series objects
dftsunits <- ts(df$Units,start = c(2015,1),frequency = 4)
dftsasp <- ts(df$ASP,start = c(2015,1),frequency = 4)
# Train forecasting models (Holt-Winters and ARIMA)
FC_Units_HW <- hw(dftsunits,h=12)
FC_Units_Arima <- auto.arima(dftsunits,lambda = 0) #lambda = 0 prevents negative forecasts
FC_ASP_HW <- hw(dftsasp,h=12)
FC_ASP_Arima <- auto.arima(dftsasp,lambda = 0)
# Forecast models for 12 quarters
FC_Units_HW2 <- forecast(FC_Units_HW,h=12)
FC_Units_Arima2 <- forecast(FC_Units_Arima,h=12)
FC_ASP_HW2 <- forecast(FC_ASP_HW,h=12)
FC_ASP_Arima2 <- forecast(FC_ASP_Arima,h=12)
# Save results
Data_fc3$Units_HW <- FC_Units_HW2$mean
Data_fc3$Units_ARIMA <- FC_Units_Arima2$mean
Data_fc3$ASP_HW <- FC_ASP_HW2$mean
Data_fc3$ASP_ARIMA <- FC_ASP_Arima2$mean
# Add results to master result data frame
Data_fc2 <= rbind(Data_fc2,Data_fc3)
}
解决此问题的一种快速方法是不要在循环外初始化空数据帧(即第 7-10 行),而是在循环内包含一个 if 语句来检查它是否是第一次迭代(即如果我 == 1).如果是 - 不要执行 rbind,但如果不是,则执行 rbind。这样的事情可能会奏效:
if (i == 1) {
data_out <- Data_fc3
} else {
data_out <- rbind(data_out, Data_fc2)
}
谢谢 Gregor 找出我的语法错误!虽然我的代码现在有效......但它仍然非常低效。我很想知道在循环中组合数据的最佳方法是什么。
干杯!
Data_fc2 <- rbind(Data_fc2,Data_fc3)
考虑 by
通过唯一分组对数据进行子集化,以构建一个 list 数据帧 rbind
once 在循环外。下面分配了一个通用的用户定义方法,该方法输入和输出子集数据帧并将其传递给 by
:
# Create actual data frame
Data_act <- subset(Data, Type=="Actual")
# Create empty data frame for forecast results
Data_fc <- subset(Data[1:12,6:9], Type=="Forecast")
# GENERALIZED METHOD
proc_forecast <- function(sub_df) {
# Create time series objects
dftsunits <- ts(sub_df$Units, start = c(2015,1), frequency = 4)
dftsasp <- ts(sub_df$ASP, start = c(2015,1), frequency = 4)
# Train forecasting models (Holt-Winters and ARIMA)
FC_Units_HW <- hw(dftsunits, h=12)
FC_Units_Arima <- auto.arima(dftsunits, lambda = 0)
FC_ASP_HW <- hw(dftsasp, h=12)
FC_ASP_Arima <- auto.arima(dftsasp, lambda = 0)
# Forecast models for 12 quarters and save results to new columns
sub_df <- within(Data_fc, {
Units_HW <- forecast(FC_Units_HW, h=12)$mean
Units_ARIMA <- forecast(FC_Units_Arima, h=12)$mean
ASP_HW <- forecast(FC_ASP_HW, h=12)$mean
ASP_ARIMA <- forecast(FC_ASP_Arima, h=12)$mean
})
return(sub_df)
}
# BY CALL
df_list <- by(Data_act, Data_act$forecast_name, proc_forecast)
# FINAL DF BUILD
final_df <- do.call(rbind, df_list)
final_df <- cbind(subset(Data[1:5], Type=="Forecast"), final_df)
final_df <- rbind(Data_act, final_df)
此代码有效。我很想知道如何提高效率。我需要在实际之后附加预测。
# Create actual data frame
Data_act <- subset(Data,Data$Type=="Actual")
# Create forecast frame with descriptive columns
Data_fc <- subset(Data[1:5],Data$Type=="Forecast")
# Create empty data frame for forecast results
Data_fc2 <- subset(Data[,6:9],Data$Type=="Forecast")
Data_fc2 <- Data_fc2[1:12,]
Data_fc3 <- Data_fc2 # temp table for loop
# Create list of unique forecast names
UniqueList <- unique(Data_act$forecast_name)
# Loop through unique list of forecast names and run time series
for(i in 1:length(UniqueList)){
# Subset data for forecast name
df <- subset(Data_act,Data_act$forecast_name==UniqueList[i])
# Create time series objects
dftsunits <- ts(df$Units,start = c(2015,1),frequency = 4)
dftsasp <- ts(df$ASP,start = c(2015,1),frequency = 4)
# Train forecasting models (Holt-Winters and ARIMA)
FC_Units_HW <- hw(dftsunits,h=12)
FC_Units_Arima <- auto.arima(dftsunits,lambda = 0) #lambda = 0 prevents negative forecasts
FC_ASP_HW <- hw(dftsasp,h=12)
FC_ASP_Arima <- auto.arima(dftsasp,lambda = 0)
# Forecast models for 12 quarters
FC_Units_HW2 <- forecast(FC_Units_HW,h=12)
FC_Units_Arima2 <- forecast(FC_Units_Arima,h=12)
FC_ASP_HW2 <- forecast(FC_ASP_HW,h=12)
FC_ASP_Arima2 <- forecast(FC_ASP_Arima,h=12)
# Save results
Data_fc3$Units_HW <- FC_Units_HW2$mean
Data_fc3$Units_ARIMA <- FC_Units_Arima2$mean
Data_fc3$ASP_HW <- FC_ASP_HW2$mean
Data_fc3$ASP_ARIMA <- FC_ASP_Arima2$mean
# Add results to master result data frame
Data_fc2 <- rbind(Data_fc2,Data_fc3)
}
Data_fc2 <- na.omit(Data_fc2)# Remove original 12 empty rows
Data_fc <- cbind(Data_fc,Data_fc2)
Data_Final <- rbind(Data_act,Data_fc)