循环期间的 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)