rbind.data.frame的性能
rbind.data.frame的性能
我有一个数据帧的列表,我确信它们都至少包含一行数据(实际上,有些只包含一行,而其他一些包含给定数量的行),并且它们都具有相同的列(名称和类型)。如果有关系的话,我也可以确定行中没有任何缺失值。
可以通过以下方式模拟这种情况:
#创建一行数据 onerowdfr<-do.call(data.frame, c(list(), rnorm(100) , lapply(sample(letters[1:2], 100, replace=TRUE), function(x){factor(x, levels=letters[1:2])}))) colnames(onerowdfr)<-c(paste("cnt", 1:100, sep=""), paste("cat", 1:100, sep="")) #在列表中重复使用它 someParts<-lapply(rbinom(200, 1, 14/200)*6+1, function(reps){onerowdfr[rep(1, reps),]})
我已经设置了参数(随机化)以使其接近我的真实情况。
现在,我想将所有这些数据帧合并成一个数据帧。我认为使用rbind可以完成这个任务,像这样:
system.time( result<-do.call(rbind, someParts) )
在我的系统上(并不特别慢),并使用上述设置,这需要的时间是system.time 的输出:
user system elapsed 5.61 0.00 5.62
将200个变量的254行进行rbind花费近6秒?肯定有办法可以提高性能吧?在我的代码中,我经常需要做类似的事情(它是一种多重插补形式),所以我需要尽可能快地完成。
Performance of rbind.data.frame 出现的原因是 rbind.data.frame 函数在处理大量的数据框时速度较慢。解决方法是使用 data.table 包中的 rbindlist() 函数,该函数在处理大型数据框时速度更快。
下面是一个使用了 rbindlist() 函数的示例:
library(data.table) # 创建一个空的 data.table dt <- data.table() # 循环读取数据框,并使用 rbindlist() 函数合并到 dt 中 for (i in 1:3000) { df <- read.csv(paste0("data", i, ".csv")) dt <- rbindlist(list(dt, df)) } # 输出合并后的数据表 print(dt)
通过使用 rbindlist() 函数,可以大大提高合并数据框的速度。在作者的示例中,他的数据集包含3000个数据框,每个数据框有1000行和40列,使用 rbindlist() 函数只需20秒即可完成合并操作。
在上面的内容中,作者提到使用rbind.fill
代替rbind
可以减少大约10%的运行时间。那么,为什么rbind.fill
比rbind
要快呢?
问题的原因是rbind
函数在合并数据框时的效率较低。rbind
函数是基于行来合并数据框的,它会逐行扫描每个数据框,并将它们逐行添加到新的数据框中。这种逐行扫描和逐行添加的方式在处理大量数据时会导致性能下降。
解决这个问题的方法是使用rbind.fill
函数。这个函数来自于plyr
包,它在合并数据框时使用了更高效的算法。相比于rbind
函数,rbind.fill
函数可以更快速地完成数据框的合并操作,从而减少了运行时间。
总结起来,Performance of rbind.data.frame
这个问题的原因是rbind
函数在合并数据框时的效率较低。为了解决这个问题,可以使用rbind.fill
函数代替rbind
函数,从而提高合并数据框的性能。使用rbind.fill
函数可以减少运行时间,提高代码的效率。
Performance of rbind.data.frame
在R语言中,当我们需要将多个数据框(data frame)进行纵向合并时,通常会使用rbind.data.frame()函数。然而,使用这个函数可能会导致性能问题,特别是当数据框中包含大量的因子变量时。本文将讨论这个性能问题的原因,并提供了一些解决方法。
问题的原因是,rbind.data.frame()函数在处理因子变量时速度较慢。在上面的代码示例中,通过比较使用纯数值变量构建数据框和使用因子变量构建数据框的性能,可以看出使用纯数值变量的数据框时rbind函数更快。具体来说,在上述代码示例中,构建只包含数值变量的矩阵并使用rbind函数合并这些矩阵的速度更快。
解决这个问题的方法之一是将所有的因子变量转换为数值变量进行合并,然后再将必要的列转换回因子变量。在上面的代码示例中,使用lapply函数将每个数据框转换为数值矩阵,然后使用do.call和rbind函数对这些矩阵进行合并。最后,使用一个循环将转换后的列转换回因子变量。
另一种方法是使用矩阵而不是数据框来处理数据。在上述代码示例中,使用matrix函数将数据框转换为数值矩阵,然后使用rbind函数合并这些矩阵。这种方法的性能比使用数据框更好。
rbind.data.frame()函数在处理因子变量时性能较差。为了提高性能,可以考虑将因子变量转换为数值变量进行合并,然后再转换回因子变量,或者直接使用数值矩阵进行合并。