2010-12-03 120 views
10

我使用R的ff包,並且我需要使用一些ffdf對象(尺寸大約爲1.5M x 80)。儘管如此,我仍然遇到了一些麻煩,不知道是否有效切割/切割操作。在R中設置ffdf對象

比如我有一個名爲「年」和「年齡」兩整列,我想使AGE的表時,這一年是2005年。

一種方法是這樣的:

ffwhich <- function(x, expr) { 
    b <- bit(nrow(x)) 
    for(i in chunk(x)) b[i] <- eval(substitute(expr), x[i,]) 
    b 
} 
bw <- ffwhich(a.fdf, YEAR==1999) 
answer <- table(a.fdf[bw, "AGE"]) 

table()操作很快,但構建位向量非常慢。任何人有任何更好的做法的建議?

回答

0

不熟悉操作ff對象,但你描述像一個典型的tapply()任務的聲音問題:

answer <- tapply(a.fdf$YEAR[a.fdf$YEAR == 1995], a.fdf$AGE[a.fdf$YEAR == 1995], length) 

我會假設類似的東西會走得比你上面給的兩個步驟的解決方案更快,但也許我誤解了ff數據結構的工作原理?

+0

如果不是`ff`,我可以做更簡單的事情,比如`with(subset(a.fdf,YEAR == 1999),table(AGE))`。 `ff`是使它更棘手的部分。 – 2010-12-06 17:17:45

2

程序包ffbaseff/ffdf對象提供了許多基本功能,包括subset.ff。通過一些有限的測試,看起來subset.ff相對較快。嘗試加載ffbase,然後使用您在先前評論(with(subset(a.fdf, YEAR==1999))中建議的更簡單的代碼。

0

我的做法是這樣的:

system.time({ 
index <- as.ff(which(a.fdf[,'Location'] == 'exonic')); 
table(a.fdf[index,][,'Function']); 
});                        
user system elapsed 
1.128 0.172 1.317 

似乎比顯著快:

system.time({ 
bw <- ffwhich(a.fdf, Location=="exonic"); 
table(a.fdf[bw,'Function']); 
}) 
user system elapsed 
24.901 0.208 25.150 

因人而異,因爲這些因素,不是人物,而我ffdf是〜4.3M * 42.

identical(table(a.fdf[bw,'Function']), table(a.fdf[index,][,'Function'])); 
[1] TRUE