【问题标题】:Subsetting ffdf objects in RR中的子集ffdf对象
【发布时间】:2010-12-03 20:32:01
【问题描述】:

我正在使用 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() 操作很快,但构建位向量却很慢。有没有人有更好的建议?

【问题讨论】:

    标签: r ff


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      不熟悉操作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 是让它变得更棘手的部分。
      【解决方案3】:

      我的方法是这样的:

      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
      

      【讨论】:

        猜你喜欢
        • 2012-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-25
        • 2016-09-17
        • 1970-01-01
        • 2012-11-10
        • 1970-01-01
        相关资源
        最近更新 更多