在R中对ffdf对象进行子集操作

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() 操作速度很快,但构建位向量相当慢。 你有什么更好的建议吗?

3个回答

1

ffbaseff/ffdf对象提供了许多基本函数,包括subset.ff。经过有限的测试,似乎subset.ff相对较快。尝试加载ffbase,然后使用您之前在评论中建议的简单代码(with(subset(a.fdf, YEAR==1999))。


0

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

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

我认为这样的方法比你上面给出的两步解决方案更快,但也许我没有理解 ff 数据结构的工作原理?

如果没有ff,我可以做得更简单,比如 with(subset(a.fdf, YEAR==1999), table(AGE))ff是使它变得棘手的部分。 - Ken Williams

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接