到目前爲止,我一直在使用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?
你的第一個問題,'as.ffdf(temp)'應該工作。你有什麼錯誤? – agstudy
對於第二個問題,你應該給你的「基礎」表,你在'ff'中嘗試了什麼(你會得到什麼錯誤) – agstudy
當使用as.ffdf時,錯誤說了一些關於字符的模式。對於第二個問題,我的大多數計算都是使用ifelse和sum的組合。行上的總和在ff中不起作用。 sum(ff [,rowNum]> = 5) - >無效 – Drew75