2

私は R と FF パッケージを初めて使用し、ユーザーが FF を使用して大規模なデータセット (>4Gb) を操作できるようにする方法をよりよく理解しようとしています。私はかなりの時間を Web のチュートリアルのトロールに費やしてきましたが、見つけることができたものは一般的に頭を悩ませています。

私は実行することで最もよく学ぶので、演習として、R の組み込みの「Indometh」データセットと同様に、任意の値を使用して長い形式の時系列データセットを作成する方法を知りたいと思います。次に、ワイドフォーマットに再形成したいと思います。次に、出力をcsvファイルとして保存したいと思います。

小さなデータセットの場合、これは簡単で、次のスクリプトを使用して実現できます。

##########################################
#Generate the data frame

DF<-data.frame()
for(Subject in 1:6){
  for(time in 1:11){
    DF<-rbind(DF,c(Subject,time,runif(1)))
  }
}
names(DF)<-c("Subject","time","conc")

##########################################
#Reshape to wide format

DF<-reshape(DF, v.names = "conc", idvar = "Subject", timevar = "time", direction = "wide")

##########################################
#Save csv file

write.csv(DF,file="DF.csv")

しかし、約 10 Gb のファイル サイズに対してこれを行う方法を学びたいと思います。FFパッケージを使用してこれを行うにはどうすればよいですか? 前もって感謝します。

4

2 に答える 2

3

The function reshape does not explicitly exists for ffdf objects. But it is quite straightforward to execute with functionality from package ffbase. Just use ffdfdply from package ffbase, split by Subject and apply reshape inside the function.

An example on the Indometh dataset with 1000000 subjects.

require(ffbase)
require(datasets)
data(Indometh)

## Generate some random data
x <- expand.ffgrid(Subject = ff(factor(1:1000000)), time = ff(unique(Indometh$time)))
x$conc <- ffrandom(n=nrow(x), rfun = rnorm)
dim(x)
[1] 11000000        3

## and reshape to wide format
result <- ffdfdply(x=x, split=x$Subject, FUN=function(datawithseveralsplitelements){
  df <- reshape(datawithseveralsplitelements, 
              v.names = "conc", idvar = "Subject", timevar = "time", direction = "wide")
  as.data.frame(df)
})
class(result)
[1] "ffdf"
colnames(result)
[1] "Subject"   "conc.0.25" "conc.0.5"  "conc.0.75" "conc.1"    "conc.1.25" "conc.2"    "conc.3"    "conc.4"    "conc.5"    "conc.6"    "conc.8"   
dim(result)
[1] 1000000      12
于 2014-01-31T10:48:43.243 に答える