R rbind во время цикла - PullRequest
       16

R rbind во время цикла

0 голосов
/ 04 февраля 2019

Этот код работает для всего ... кроме части 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 голосов
/ 07 февраля 2019

Этот код действует.Я хотел бы знать, как сделать это более эффективным.Мне нужно добавить прогнозы после фактических данных.

# 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)
0 голосов
/ 04 февраля 2019

Спасибо, Грегор, за обнаружение синтаксической ошибки!Хотя мой код эффективен сейчас ... он все еще ужасно неэффективен.Я хотел бы знать, каков наилучший способ объединения данных в цикле.

Ура!

Data_fc2 <- rbind(Data_fc2,Data_fc3)
0 голосов
/ 04 февраля 2019

Рассмотрим 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)
0 голосов
/ 04 февраля 2019

Быстрый способ исправить это - вместо инициализации пустого информационного кадра вне цикла (т. Е. Строки 7-10), в цикл включите оператор if, чтобы проверить, является ли это первой итерацией (т. Е. Если i == 1),Если это так - не делайте rbind, но если нет, делайте rbind.Примерно так может работать:

if (i == 1) {
data_out <- Data_fc3
} else {
data_out <- rbind(data_out, Data_fc2)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...