此代码适用于所有内容...除了结尾处的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)
}
答案 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)