大数据框架,rbind和第二个地狱圈

时间:2014-07-23 08:41:02

标签: r dataframe rbind

我有一些包含数据的海量数据集,我必须逐步分析和排序。在此之前,我创建了一个这样的函数:

big.data.frame<-read.csv(data)
my.function<-function(big.data.frame){



 for(i in 1:100) {

 sort/analyze big.data.frame & store into a new data frame: my.df
 if(i==1) iteration.result<-my.df
 if(i>1) iteration.result<-rbind(my.df,iteration.result)

                 }
 return(iteration.result)

}

使用我的数据运行此功能需要90分钟。它绝对可怕。而我的问题是我陷入了第二个地狱圈,如下所示:How can I prevent rbind() from geting really slow as dataframe grows larger?

现在,我已经从上面链接中@joran的建议和The R Inferno改变了我的代码:

 big.data.frame<-read.csv(data)
 my.function<-function(big.data.frame){



     my.list = vector(mode="list",100)
     for(i in 1:100) {

     sort/analyze big.data.frame & store into a new data frame: my.df
     my.list[[i]]<-my.df

                     }
     result <- do.call(rbind, my.list)
     return(result)

    }

但是运行这个也需要90分钟。我认为避免增加行的增量应该会有所帮助,但是没有。

注意#1:我需要采取100个步骤。

注意#2:我的数据是存储在数据框中的原始数据集。我需要提取信息,计算和重新构建整个原始数据框。所以每次迭代中的新数据框(我称之为my.df)看起来与原始数据集完全不同。

注意#3:这是summaryRprof()的大部分输出:

$by.total
                         total.time total.pct self.time self.pct
"my.function      "         5010.42    100.00      0.14     0.00
"unlist"                    4603.32     91.87   4593.42    91.68
"function1"                 2751.96     54.92      0.04     0.00
"function2"                 2081.26     41.54      0.02     0.00
"["                          229.72      4.58      0.08     0.00
"[.data.frame"               229.66      4.58     17.60     0.35
"match"                      206.96      4.13    206.64     4.12
"%in%"                       206.52      4.12      0.28     0.01
"aggregate"                  182.76      3.65      0.00     0.00
"aggregate.data.frame"       182.74      3.65      0.04     0.00
"lapply"                     177.86      3.55     35.84     0.72
"FUN"                        177.82      3.55     68.06     1.36
"mean.default"                38.36      0.77     35.68     0.71
"unique"                      31.90      0.64      4.74     0.09
"sapply"                      26.34      0.53      0.02     0.00
"as.factor"                   25.86      0.52      0.02     0.00
"factor"                      25.84      0.52      0.24     0.00
"split"                       25.22      0.50      0.10     0.00
"split.default"               25.12      0.50      2.60     0.05
"as.character"                19.30      0.39     19.26     0.38
"aggregate.default"           14.40      0.29      0.00     0.00
"simplify2array"              12.94      0.26      0.02     0.00
"eval"                         5.94      0.12      0.10     0.00
"list"                         5.16      0.10      5.16     0.10
"NextMethod"                   4.04      0.08      4.04     0.08
"transform"                    4.04      0.08      0.00     0.00
"transform.data.frame"         4.04      0.08      0.00     0.00
"=="                           3.90      0.08      0.02     0.00
"Ops.factor"                   3.88      0.08      0.92     0.02
"sort.list"                    3.74      0.07      0.12     0.00
"[.factor"                     3.62      0.07      0.00     0.00
"match.arg"                    3.60      0.07      0.96     0.02
"ifelse"                       3.34      0.07      0.66     0.01
"levels"                       2.54      0.05      2.54     0.05
"noNA.levels"                  2.52      0.05      0.00     0.00
"data.frame"                   1.78      0.04      0.52     0.01
"is.numeric"                   1.54      0.03      1.54     0.03
"deparse"                      1.40      0.03      0.12     0.00
".deparseOpts"                 1.28      0.03      0.02     0.00
"formals"                      1.24      0.02      1.22     0.02
"as.data.frame"                1.24      0.02      0.00     0.00

注意#4:如果我正确地解释了事情,我看到“unlist”功能需要花费很多时间。我的函数my.function实际上以列表作为参数:

my.function<-function(data,...) {
dots<-list(...)
dots<-unlist(dots)

... etc

}

0 个答案:

没有答案