1

「ITEM」の値を列と値(「ITEM2」)として使用して、データ(data.frame)をロングフォーマットからワイドフォーマットにキャストしたい(以下を参照):

ロングフォーマット

ワイドフォーマット

したがって、パッケージ reshape2 の dcast-function を使用します。

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

これを行うと、すべて正常に動作します。

しかし、データ フレームに 7m のデータ レコードがあり、メモリの制限に苦労していました。したがって、ffdf で data.frame を変換し、パッケージ ffbase の ffdfdply-function を使用してフレームをキャストすることにしました。

すべての分割に同じ順序で同じ列があることを確認するために、事前に「ITEM」から値を抽出し、存在しない場合は列に N/A を追加し、すべての列をアルファベット順に並べます。

コード全体の下:

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

#Transform to ffdf
ff_raw<-as.ffdf(lo_raw)
ff_raw$SEQUENCEID<-as.character.ff(ff_raw$SEQUENCEID)

#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[,order(colnames(df))]
  df
}

#Apply dcast
ff_pivot<-ffdfdply(x=ff_raw,split=ff_raw$SEQUENCEID,FUN=function(df,item) castff(df,item),item=item,BATCHBYTES=1000000,trace=TRUE)

残念ながら、2 番目の分割の結果を最初の分割に (トレースを使用して) 追加すると、次のエラーが発生します。

2016-12-08 09:25:35, calculating split sizes
2016-12-08 09:25:37, building up split locations
2016-12-08 09:25:51, working on split 1/139, extracting data in RAM of 106 split elements, totalling, 0.00093 GB, while max specified data specified using BATCHBYTES is 0.00093 GB
2016-12-08 09:25:52, ... applying FUN to selected data
2016-12-08 09:25:55, ... appending result to the output ffdf
2016-12-08 09:26:02, working on split 2/139, extracting data in RAM of 172 split elements, totalling, 0.00093 GB, while max specified data specified using BATCHBYTES is 0.00093 GB
2016-12-08 09:26:03, ... applying FUN to selected data
2016-12-08 09:26:05, ... appending result to the output ffdf
Error in ff(vmode = "integer", length = length(x), levels = as.character(levs)) : unable to open
In addition: Warning message:
In is.na(levs) : is.na() applied to non-(list or vector) of type 'NULL'

追加せずに少ないレコードで 1 つの分割のみを計算すると、正常に機能します。

誰か助けてくれませんか?

ありがとうございました。

4

0 に答える 0