2014-01-31 50 views
2

我是R和FF包的新手,並且試圖更好地理解FF如何讓用戶使用大型數據集(> 4Gb)。我花了相當多的時間在網上搜尋教程,但我能找到的那些通常會超出我的頭腦。使用FF包創建和重塑R中大數據的函數

我在做的最好,所以作爲一個練習,我想知道如何使用任意值創建一個長格式的時間序列數據集,類似於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包來做到這一點?提前致謝。

回答

3

功能reshape沒有明確存在ffdf對象。但使用包ffbase的功能執行相當簡單。只需使用包ffbase中的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 
+0

謝謝你的有用答案。 – Luke23

0

你會很難建立一個比你提供的效率低的方法。使用rbind.data.frame的效率非常低。試試這個,而不是創建一個六千線數據集的6個科目:

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

縮放它有一個十億項目(美國十億,而不是英國十億),應該給你一個10GB的對象,所以也許嘗試80000000線左右?

我認爲要求在ff-package中的教程超出了SO的範圍。請閱讀常見問題。這些問題通常是封閉的,因爲提問者表明他們並不真正知道他們在談論什麼。

+0

首先,謝謝你改進我的代碼。 – Luke23

+0

二,你顯然沒有看過我的問題。我沒有要求ff-package中的教程。我問如何做一個非常具體的任務。你的回答表明你不明白如何完成這項任務。 – Luke23

+0

嗯,我的確看過了我在編碼方面的努力所能看到的問題。但我承認不知道jwiffels提供了'ffdfdply'這個令人難以置信的緊湊解決方案。所以我想我會讓你們兩個都高興。 –