循环期间搜寻

时间:2019-02-04 13:53:54

标签: r loops rbind

此代码适用于所有内容...除了结尾处的rbind部分。我想从循环中获取结果,并将其组合为一个预测数据帧。我试图创建一个空的临时数据帧(我预测为12个季度),但出现“大小不相等”错误。

有人可以帮我吗?我快到了:-)

# 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)
}

4 个答案:

答案 0 :(得分:0)

一种解决此问题的快速方法是,而不是在循环外部(即第7-10行)初始化空数据框,而在循环内包含if语句以检查它是否是第一次迭代(即,如果i == 1) 。如果是,请不要执行rbind,否则请不要执行rbind。这样的事情可能会起作用:

if (i == 1) {
data_out <- Data_fc3
} else {
data_out <- rbind(data_out, Data_fc2)
}

答案 1 :(得分:0)

谢谢Gregre,找到我的语法错误!虽然我的代码现在生效了,但是效率仍然非常低。我想知道在循环中组合数据的最佳方法是什么。

干杯!

Data_fc2 <- rbind(Data_fc2,Data_fc3)

答案 2 :(得分:0)

请考虑by通过唯一分组对数据进行子集化,以在循环之外rbind 一次建立数据帧的列表。下面分配了一种通用的用户定义方法,该方法输入和输出子集数据帧并将其传递到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)

答案 3 :(得分:0)

此代码有效。我很想知道如何提高效率。我需要将预测值附加在实际值之后。

If WorksheetFunction.IsNA(Application.WorksheetFunction.VLookup(ListBox1.Selected(0), Range("B4:C7"), 2, False)) = True Then
'Create row
 Range("EndlineFM").Select
   Selection.Insert Shift:=xlDown
 'Initialise Detail and montant of new row
   Range("TotalF").Offset(-1, 0) = FraisM.ListBox1.Selected(0)
Range("TotalF").Offset(-1, 1) = CSng(FraisM.Chiffremontant)