使用FF包在R中创建和重塑大数据的功能

时间:2014-01-31 04:33:56

标签: r bigdata reshape ff ffbase

我是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包来做到这一点?提前谢谢。

2 个答案:

答案 0 :(得分:3)

ffdf对象没有显式存在函数reshape。但是使用包ffbase执行功能非常简单。只需使用包ffbase中的ffdfdply,按主题拆分并在函数内应用reshape

具有1000000个主题的Indometh数据集的示例。

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

答案 1 :(得分:0)

你很难构建一种效率低于你提供的方法。使用rbind.data.frame非常低效。试着这样做,为6个科目创建一个六千行数据集:

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

将它扩展到拥有10亿个项目(10亿美元,而不是10亿美元)应该会给你一个10GB的对象,所以可能会尝试8000万行左右?

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