我正在浏览data.table的文档,从这里的一些对话中也注意到rbindlist应该比rbind好.

我想知道为什么rbindlistrbind好,在哪些情况下rbindlistrbind好?

在内存利用率方面有什么优势吗?

推荐答案

rbindlistdo.call(rbind, list(...))的优化版本,使用rbind.data.frame时速度较慢


它在哪里真正出色

一些问题显示了rbindlist的重要性

Fast vectorized merge of list of data.frames by row

Trouble converting long list of data.frames (~1 million) to single data.frame using do.call and ldply

这些基准显示了它的速度有多快.


阿尔宾德.数据帧变慢是有原因的

rbind.data.frame会进行大量判断,并按名称匹配.(即rbind.data.frame将说明列的顺序可能不同,并按名称匹配),rbindlist不进行这种判断,而是按位置连接

do.call(rbind, list(data.frame(a = 1:2, b = 2:3), data.frame(b = 1:2, a = 2:3)))
##    a b
## 1  1 2
## 2  2 3
## 3  2 1
## 4  3 2

rbindlist(list(data.frame(a = 1:5, b = 2:6), data.frame(b = 1:5, a = 2:6)))
##     a b
##  1: 1 2
##  2: 2 3
##  3: 1 2
##  4: 2 3

rbindlist的其他一些限制

由于一个已经修复的错误,它很难处理factors个:

rbindlist two data.tables where one has factor and other has character type for a column (Bug #2650)

它有重复列名的问题

看见


阿尔宾德.数据帧行名可能令人沮丧

rbindlist可以处理listsdata.framesdata.tables,并将返回一个数据.不带行名的表

你可以用do.call(rbind, list(...))来搞乱行名

How to avoid renaming of rows when using rbind inside do.call?


内存效率

就内存而言,rbindlist是在C中实现的,内存效率也是如此,它使用setattr通过引用来设置属性

rbind.data.frameR中实现,它执行大量赋值,并使用attr<-(以及class<-rownames<-),所有这些都将(在内部)创建所创建数据的副本.框架

R相关问答推荐

是否有任何解决方案可以优化VSCode中RScript的图形绘制?

使用ggcorrplot在相关性矩阵上标注supertitle和index标签

提取R中值和列名的所有可能组合

在R底座中更改白天和夜晚的背景 colored颜色

在(g)子中使用asserable字符

向gggplot 2中的数据和轴标签添加大写和星号

用预测NLS处理R中生物学假设之上的误差传播

基于多列将值链接到NA

在R中,如何在每个堆叠的条上放置误差条,特别是当使用facet_grid时?

如何从像glm这样的模型中提取系数表的相关性?

在R中按行按列范围查找最大值的名称

将Posict转换为数字时的负时间(以秒为单位)

在R中,我如何使用滑动窗口计算位置,然后进行过滤?

将箭头绘制在图形外部,而不是图形内部

使用未知字符数(不受限制的最大长度)的Lookback有什么好的替代方案?

计算Mean by分组和绑定到R中的数据集

按组和连续id计算日期差

当由base::限定时,`[.factor`引发NextMethod错误

合并多个数据帧,同时将它们的名称保留为列名?

通过分析特定列中的字符串在数据框中创建新的行和列