如何使用大型数据集优化循环和rbinds

时间:2017-07-27 15:11:07

标签: r loops rbind

我目前正在研究一个大型数据集(约1.5M的条目)使用R - 一种我还不完全熟悉的语言。

基本上,我尝试做的是以下内容: 我想检查在"开始"之后的时间间隔内发生了什么。 "开始"代表每个"试验"和"试验"中的一些时间值。表示为参考"参考"记录的所有试验。

因此,对于每个参考,我想检查所有试验,看看在此试验期间"开始"之后会发生什么

如果我试图做的事情仍然模糊不清,那就不是那么重要了,那就是我要检查数据框中的每一个数据。

我的本​​能(理解,R-noob-ish)编程这个函数的方式让我得到了一段代码,我知道它远未被优化,并且需要很多时间才能运行。

My_Function  <- function(DataFrame){
counts <- data.frame()
  for (reference in DataFrame$Ref){

  ref_tested <- subset(DataFrame, Ref == reference)
  ref_count <- data.frame()   

    for (trial in ref_tested$Trial){ 
      trial_tested <- subset(ref_tested, Trial == trial)

        for (timing in trial_tested$Start){
          interesting <- subset(DataFrame, Start > timing  & Start <= timing + some_time & Trial == trial) 
          ref_count <- rbind(ref_count,as.data.frame(table(interesting$ele)))
        }

     }
  temp <- aggregate(Freq~Var1,data=ref_count,FUN=sum);
  counts <- rbind (counts, temp)
  } 
return(counts)
}

这里, as.data.frame(table(有趣的是$ ele))可以有不同的长度,因此 ref_count 也是如此。

我没有找到一种在不使用rbind的情况下扩展数据帧的方法,但我也知道,考虑到输出的大小,它根本不是时间效率的。 此外,我已经使用其他语言编写过程序,例如Python或C ++(很久以前),并且知道连续3个for循环通常意味着你做错了。但话说回来,我没有办法在这种特殊情况下避免这样做。

那么,对于如何使用R或其中一个包来避免这种情况,您有什么建议吗?

提前谢谢你,

ķ。

编辑: 感谢您的第一个建议。

我试过了&#39; plyr&#39;包,并能够减少我的代码chunck的大小 - 它按预期的那样做,并且更容易理解.Plus,我能够为再现性生成一些示例数据。见:

    #Example Input
    DF <- data.frame(c(sample(1:400,500000, replace = TRUE)),c(sample(1:25,500000, replace = TRUE)), rnorm(n=500000, m=1, sd=1) )
    colnames(DF)<-c("Trial","Ref","Start")
    DF$rn<-rownames(DF)

    tempDF <- DF[sample(nrow(DF), 100), ] #For testing purposes 

    Test<- ddply(.data = tempDF, "rn", function(x){

       interesting <- subset(DF,

                        Trial == x$Trial &
                        Start > x$Start  &
                        Start < x$Start + some_time )

       interesting$Elec <- x$Ref
       return(interesting)
    })

这很好,但我仍然觉得这不是要走的路;在这个例子中,我们只浏览了100个观察,这需要大约4秒(我使用了system.time()),但如果我想扫描DF的500000个观测值,那么它需要花费超过5个小时。

我已经检查过data.table但我现在仍在尝试了解如何使用它。

0 个答案:

没有答案