Как правильно применить функцию к каждой строке быстрым (параллельным) способом - PullRequest
0 голосов
/ 25 мая 2019

У меня есть фрейм данных с несколькими строками, принадлежащими одному наблюдению.Таким образом, информация (затраты) наблюдения расположена в нескольких строках, где затраты каждой категории затрат для этого наблюдения находятся в одной строке.В общей сложности существует 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   .....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...