2013-07-04 40 views
0

到目前爲止,我一直在使用Sqldf和R函數的組合來管理我的數據集。但是,我需要在大型數據集上執行一堆左連接,並且即使使用sqldf dbname = tempfile(),也會出現內存不足的情況。結合FF基和Sqldf的R

我注意到FF的第一件事是我無法將它傳遞給sqldf。我注意到的第二件事是我的典型功能並不都適用於ff。我正常的

例與ffbase加入

base <- read.csv(filename) 
base <- sqldf("select * from base where DATE > 20120101") 

for (j in list.files()){ 
    temp <- read.csv(tempfile) 
    temp <- sqldf("select MATCH_KEY, DATE from temp") 
    base <- sqldf("select * from base NATURAL LEFT OUTER JOIN temp") 
} 

我不能簡單地用 「as.ffdf(溫度)。」解決方法是編寫一個物理臨時文件,然後以ff讀取它,然後與ff-s進行合併。我覺得這不是與ff合作的好方法。任何更好的選擇?

我面臨的第二個問題可能是由於我對ff的不熟悉程度。我有一個簡單的代碼,我只是不知道如何在ff中實現。基本上我有數據幀的基礎,我想循環並計算值大於一定數量的次數。一個使用我的日期示例的想法(實際上我也在檢查數字,比率等,但是這個想法總是相同的)。

checks <- c(20010101,20020101,20030101) 
summary <- matrix(0,ncol=dim(base)[2],nrow=length(checks)) 

for (i in checks){ 
    for (j in dim(base)[2]){ 
    summary[i,j]<-sum(base[,j]>=i) 
}} 

這些函數也不適用於ff。現在我正在使用sqldf讀取文件,然後寫入臨時文件。用ff讀取這些內容,然後完成所有合併業務。然後,我再次寫出一個臨時文件,並將其作爲正常文件讀回。 OUF!任何關於改進的建議?

[編輯]

一個大問題是,如何通過sqldf創建一個錶轉換(TEMP < -sqldf(東西))使用as.ffdf。我得到一個錯誤:「ff中的錯誤(initdata = initdata,length = length,levels = levels,ordered = ordered,:vmode'character'not implemented」

另外,函數的兩個例子I can not似乎在工作ff

1)我經常用0替換文件中的缺失值,以區分它們與從合併創建的缺失。我這樣做是通過

DF[is.na(DF)] <- 0 

與FF似乎更復雜一些,我擔心失去可讀性:Replace NAs in a ffdf object

2)以總和超過一列或行,尋找特定的值。例如,計算「R」出現在列中的次數。在ff?

+0

你的第一個問題,'as.ffdf(temp)'應該工作。你有什麼錯誤? – agstudy

+0

對於第二個問題,你應該給你的「基礎」表,你在'ff'中嘗試了什麼(你會得到什麼錯誤) – agstudy

+0

當使用as.ffdf時,錯誤說了一些關於字符的模式。對於第二個問題,我的大多數計算都是使用ifelse和sum的組合。行上的總和在ff中不起作用。 sum(ff [,rowNum]> = 5) - >無效 – Drew75

回答

1

對於第一個問題。你爲什麼不這樣做?

require(ffbase) 
base <- read.csv.ffdf(filename) 
open(base) 
base <- subset(base, DATE > 20120101) 

for (j in list.files()){ 
    temp <- read.csv.ffdf(tempfile, transFUN=function(x){ 
    x[c("MATCH_KEY","DATE")] 
    }) 
    base <- merge(base, temp, by.x="MATCH_KEY", by.y="MATCH_KEY", all.x=TRUE) 
} 

爲了sqldf工作,ffdf對象,有可能就是在它從ffdf到sqlite的推數據點在sqldf需要一些變化,這需要以塊的形式來實現,這樣就不會吹落內存。同樣,在ffdf中提取回R應該在sqldf中處理不同(也許通過使用來自ETLUtils的read.dbi.ffdf) - 也許可以將此作爲一個更改請求請求給sqldf軟件包作者。

關於你的第二個問題,請顯示你用ff嘗試過什麼,以及你停止嘗試的位置。因爲你在問題中指出的是ff完全可能的。

+0

進行其他簡單計算我避免使用read.csv.ffdf,因爲您無法指定分隔符(可以嗎?)我有不同的文件分隔符取決於文件類型「;」表示一個,「^」表示其他人等。 – Drew75

+0

使用read.table.ffdf,然後如果需要指定分隔符tor並且該文件不嚴格是csv。 – jwijffels

+0

感謝您的提示!在法國,CSV意味着以「;」分隔,並且它是excel的默認選項。我傾向於收到很多帶有奇怪分隔符的文件。 – Drew75