2

我是 R 和 FF 包的新手,我试图更好地了解 FF 如何允许用户使用大型数据集(>4Gb)。我花了相当多的时间在网上搜索教程,但我能找到的那些通常都超出了我的想象。

我通过做学得最好,所以作为练习,我想知道如何使用任意值创建一个长格式的时间序列数据集,类似于 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

对于 ffdf 对象,该函数reshape不明确存在。但是使用 package 中的功能执行非常简单ffbase。只需使用 packageffbase中的 ffdfdply ,按主题拆分并reshape在函数内部应用。

Indometh 数据集上的一个示例,包含 1000000 个主题。

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 回答
0

您将很难构建比您提供的方法效率低的方法。使用 rbind.data.frame 效率非常低。试试这个来为 6 个主题创建一个 6000 行数据集:

DF <- data.frame( Subj = rep( 1:6, each=1000), matrix(runif(6000*11), nrow=6000) )

将它扩大到拥有十亿个项目(十亿美元,而不是十亿英镑)应该会给你一个大约 10GB 的对象,所以也许尝试 8000 万行左右?

我认为在 ff-package 中请求教程超出了 SO 的范围。请阅读常见问题解答。这样的问题通常是封闭的,因为提问者表明他们并不真正知道他们在说什么。

于 2014-01-31T07:36:31.017 回答