如何快速(并行)正确地将函数应用于每一行

时间:2019-05-25 07:43:18

标签: r

我有一个数据框,其中有多个行属于一个观察值。因此,观察的信息(成本)位于多行中,该观察的每个成本类别的成本位于一行中。总共有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   .....

0 个答案:

没有答案