我是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包来做到这一点?提前谢谢。
答案 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的范围。请阅读常见问题解答。这些问题通常是封闭的,因为提问者证明他们并不真正知道他们在说什么。