我正在使用R的ff
包,并且我需要使用一些ffdf
个对象(尺寸大约1.5M x 80)。虽然我在高效的切片/切割操作中遇到了一些麻烦。
例如,我有两个名为“YEAR”和“AGE”的整数列,我想在年份是2005年时制作AGE表。
一种方法是:
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 :(得分:1)
包ffbase
为ff
/ ffdf
个对象提供了许多基本功能,包括subset.ff
。通过一些有限的测试,似乎subset.ff
相对较快。尝试加载ffbase
,然后使用之前评论中建议的更简单的代码(with(subset(a.fdf, YEAR==1999)
)。
答案 1 :(得分:0)
不熟悉操纵ff
个对象,但您描述的问题听起来像是经典的tapply()
任务:
answer <- tapply(a.fdf$YEAR[a.fdf$YEAR == 1995], a.fdf$AGE[a.fdf$YEAR == 1995], length)
我认为这样的事情会比你上面提到的两步解决方案更快,但也许我误解了ff
数据结构是如何工作的?
答案 2 :(得分: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
YMMV,因为这些是因素,而不是字符,而我的ffdf是~4.3M * 42.
identical(table(a.fdf[bw,'Function']), table(a.fdf[index,][,'Function']));
[1] TRUE