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