0

我想将我的数据(data.frame)从长格式转换为宽格式,并将“ITEM”的值作为列和值(“ITEM2”)(见下文):

长格式:

宽格式:

因此我使用 reshape2 包中的 dcast 函数:

df <= dcast(df,SEQUENCEID + EVENTID ~ ITEM, value.var="ITEM2")

这样做一切正常。但是在我的数据框中有 7m 条数据记录,我一直在为内存限制而苦苦挣扎。因此我决定使用 plyr 包中的 ddply。

为了确保每个拆分都以相同的顺序具有相同的列,我提前从“ITEM”中提取值,如果不存在则附加 N/A 列并按字母顺序对所有列进行排序。

在整个代码下方:

#Example data
lo_raw <- data.frame(SEQUENCEID=rep(1546842, 10),
               EVENTID=c(5468503146,5468503146,5468503146,5468503147,5468503147,5468503148,5468503148,5468503148,5468503148,5468503148),
               ITEM =c("cakes","limonade","coffee","coffee","juice","limonade","cakes","water","fruits","vegetable"),
               ITEM2=c("cakes","limonade","coffee","coffee","juice","limonade","cakes","water","fruits","vegetable"),
               SPLIT=rep(1547000, 10))

#Extract items 
item <- as.character(unique(lo_raw$ITEM))

#Function dcast
castff <- function(df,item){

  df = dcast(df, SEQUENCEID + EVENTID ~ ITEM, value.var="ITEM2")

  for(i in item){
    if (!(i %in% colnames(df))){
      df[,i] <- NA
    }
  }

  df <- df[,c(1,2,(order(colnames(df[,3:dim(df)[2]])))+2)]
  df
}

#Apply dcast
df_pivot <- ddply(lo_raw, .(SPLIT), .fun=function(lo_raw,item) castff(lo_raw,item), item=item, .progress="text", .inform=TRUE)

执行时ddply,使用的 RAM 在运行时不断增加,直到达到最大值 (12 GB)。因此性能非常缓慢,几个小时后我终止了 R。

有没有另一种方法来投射整个数据集?

提前致谢。

4

0 回答 0