10

我正在使用 R 的ff包,我有一些ffdf需要处理的对象(尺寸约为 1.5M x 80)。不过,我在了解有效的切片/切块操作时遇到了一些麻烦。

例如,我有两个名为“YEAR”和“AGE”的整数列,我想在 YEAR 为 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()但构建位向量非常慢。有人有更好的建议吗?

4

3 回答 3

1

该包ffbaseff/ffdf对象提供了许多基本功能,包括subset.ff. 通过一些有限的测试,它似乎subset.ff相对较快。尝试加载ffbase然后使用您从先前评论 ( with(subset(a.fdf, YEAR==1999)) 中建议的更简单的代码。

于 2013-06-13T15:39:57.930 回答
0

不熟悉操作ff对象,但您描述的问题听起来像是一个经典tapply()任务:

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

我会假设这样的事情会比你上面给出的两步解决方案移动得更快,但也许我误解了ff数据结构的工作原理?

于 2010-12-04T03:21:54.917 回答
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
于 2013-08-14T18:41:12.550 回答