代码之家  ›  专栏  ›  技术社区  ›  dnagirl

idata.frame:为什么错误“is.data.frame(df)is not true”?

  •  4
  • dnagirl  · 技术社区  · 14 年前

    我正在处理一个名为exp的大型数据帧( file here )为了提高性能,建议我从plyr中签出idata.frame()函数。但我想我用错了。

    我原来的电话,慢一点,但有效:

    df.median<-ddply(exp, 
                     .(groupname,starttime,fPhase,fCycle), 
                     numcolwise(median), 
                     na.rm=TRUE)
    

    使用idata.frame, Error: is.data.frame(df) is not TRUE

    library(plyr)
    df.median<-ddply(idata.frame(exp), 
                     .(groupname,starttime,fPhase,fCycle), 
                     numcolwise(median), 
                     na.rm=TRUE)
    

    所以,我想,也许这是我的数据。所以我尝试了 baseball 数据集。这个 idata.frame 示例工作正常: dlply(idata.frame(baseball), "id", nrow) 但如果我尝试类似于我想要的呼叫使用 棒球运动 ,不起作用:

    bb.median<-ddply(idata.frame(baseball), 
                     .(id,year,team), 
                     numcolwise(median), 
                     na.rm=TRUE)
    >Error: is.data.frame(df) is not TRUE
    

    也许我的错误在于如何指定分组?有人知道如何使我的示例有效吗?

    埃塔:

    我也尝试过:

    groupVars <- c("groupname","starttime","fPhase","fCycle")
    voi<-c('inadist','smldist','lardist')
    
    i<-idata.frame(exp)
    ag.median <- aggregate(i[,voi], i[,groupVars], median)
    Error in i[, voi] : object of type 'environment' is not subsettable
    

    它使用了一种更快的方法来获取媒体,但给出了不同的错误。我觉得我根本不懂如何使用idata.frame。

    2 回复  |  直到 12 年前
        1
  •  1
  •   mnel    12 年前

    考虑到你在处理“大”数据并寻找表现,这似乎非常适合 data.table .

    特别是 lapply(.SD,FUN) .SDcols 争论与 by

    设置 数据表

    library(data.table)
    DT <- as.data.table(exp)
    iexp <- idata.frame(exp)
    

    哪些列是 numeric

    numeric_columns <- names(which(unlist(lapply(DT, is.numeric))))
    
    
    
    dt.median <- DT[, lapply(.SD, median), by = list(groupname, starttime, fPhase, 
        fCycle), .SDcols = numeric_columns]
    

    一些基准

    library(rbenchmark)
    benchmark(data.table = DT[, lapply(.SD, median), by = list(groupname, starttime, 
        fPhase, fCycle), .SDcols = numeric_columns], 
     plyr = ddply(exp, .(groupname, starttime, fPhase, fCycle), numcolwise(median), na.rm = TRUE), 
     idataframe = ddply(exp, .(groupname, starttime, fPhase, fCycle), function(x) data.frame(inadist = median(x$inadist), 
            smldist = median(x$smldist), lardist = median(x$lardist), inadur = median(x$inadur), 
            smldur = median(x$smldur), lardur = median(x$lardur), emptyct = median(x$emptyct), 
            entct = median(x$entct), inact = median(x$inact), smlct = median(x$smlct), 
            larct = median(x$larct), na.rm = TRUE)), 
     aggregate = aggregate(exp[, numeric_columns],
                           exp[, c("groupname", "starttime", "fPhase", "fCycle")], 
                  median), 
     replications = 5)
    
    ##         test replications elapsed relative user.self 
    ## 4  aggregate            5    5.42    1.789      5.30   
    ## 1 data.table            5    3.03    1.000      3.03    
    ## 3 idataframe            5   11.81    3.898     11.77       
    ## 2       plyr            5    9.47    3.125      9.45       
    
        2
  •  0
  •   Brandon Bertelsen    14 年前

    奇怪的行为,但即使在文档中,它也说idata.frame是实验性的。你可能发现了一个虫子。也许您可以重写ddply顶部的检查,即tests is.data.frame()。

    在任何情况下,这会减少大约20%的时间(在我的系统上):

    system.time(df.median<-ddply(exp, .(groupname,starttime,fPhase,fCycle), function(x) data.frame(
    inadist=median(x$inadist),
    smldist=median(x$smldist),
    lardist=median(x$lardist),
    inadur=median(x$inadur),
    smldur=median(x$smldur),
    lardur=median(x$lardur),
    emptyct=median(x$emptyct),
    entct=median(x$entct),
    inact=median(x$inact),
    smlct=median(x$smlct),
    larct=median(x$larct),
    na.rm=TRUE))
    ) 
    

    Shane在另一篇文章中问你是否可以缓存脚本的结果。我对您的工作流程并不了解,但是最好是设置一个chron来运行它,并每天/每小时存储结果。