我想将数据(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在runtim处增加,直到达到其最大值(12 GB) . 因此性能非常慢,我在几个小时后终止了R.

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

提前致谢 .