У меня есть фрейм данных с несколькими строками, принадлежащими одному наблюдению.Таким образом, информация (затраты) наблюдения расположена в нескольких строках, где затраты каждой категории затрат для этого наблюдения находятся в одной строке.В общей сложности существует 80 различных видов категорий затрат, как переменных, так и постоянных.Не каждое наблюдение имеет расходы по всем категориям затрат.
Я хочу, чтобы все затраты для каждого наблюдения были в одной строке.
Я создал (новый) фрейм данных со всеми (уникальными) наблюдениями и создал столбцы для каждой категории затрат, разделивв постоянных и переменных затратах.
Теперь я хочу эффективно заполнить новый информационный кадр всей информацией из исходного информационного кадра.Для этого я создал функцию (для каждой строки), которая устанавливает подмножество наблюдения и всех принадлежащих ему строк из исходного набора данных.Эта функция возвращает одну строку.Однако эта функция не работает для меня в применении.Эта функция работает очень медленно в цикле for, поэтому это не опция
#Three different fictional cost categories
costcats <- c("CAT1","CAT2","CAT3")
# A loop to create the new columns and fill with zero (for now)
for(j in 1:length(costcats)){
ALL_ONE_ROW[,paste("FIX",costcats[j],sep="")] <- 0
ALL_ONE_ROW[,paste("VAR_",costcats[j],sep="")] <- 0
}
# PK is the unique identifier of an observation
# Function to subset multiple rows from original dataset and return one
row
cost_fast <- function(row){
d <- LARGE_COST %>% filter(PK==row["PK"]) #subset from the original
for(i in 1:nrow(d)){ #Loop over the rows of the observation and fill
the belonging column
row[,paste("FIXED",d[i,"COSTCAT"],sep="_")] <- d[i,"FIXCOST"]
row[,paste("VAR",d[i,"COSTCAT"],sep="_")] <- d[i,"VARCOST"]
}
return(row)
}
#Apply the function to each row
ALL_ONE_ROW <- apply(ALL_ONE_ROW,1,cost_fast)
Этот код работает в цикле for, но ужасно медленно.Поэтому я хочу, чтобы этот код работал максимально эффективно, потому что наборы данных довольно большие.
Пример:
head(LARGE_COST)
PK COSTCAT FIXCST VARCOST
1 BI-73-01/04/2018 23Q -48.48 -48.48
2 BI-73-01/04/2018 41G 130.92 0
3 BI-73-01/04/2018 23Q 235.78 235.78
4 BI-73-01/04/2018 41G 173.48 0
5 BI-73-01/04/2018 22Q 0.19 0.19
6 BI-73-01/04/2018 23Q 40.35 40.35
Я хочу получить:
PK FIX_23Q VAR_23Q FIX_41G VAR_41G .....
BI-73-01/04/2018 -48.48 -48.48 130.92 0 .....