我正在浏览data.table
的文档,从这里的一些对话中也注意到rbindlist
应该比rbind
好.
我想知道为什么rbindlist
比rbind
好,在哪些情况下rbindlist
比rbind
好?
在内存利用率方面有什么优势吗?
我正在浏览data.table
的文档,从这里的一些对话中也注意到rbindlist
应该比rbind
好.
我想知道为什么rbindlist
比rbind
好,在哪些情况下rbindlist
比rbind
好?
在内存利用率方面有什么优势吗?
rbindlist
是do.call(rbind, list(...))
的优化版本,使用rbind.data.frame
时速度较慢
一些问题显示了rbindlist
的重要性
Fast vectorized merge of list of data.frames by row
这些基准显示了它的速度有多快.
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
由于一个已经修复的错误,它很难处理factors
个:
rbindlist two data.tables where one has factor and other has character type for a column (Bug #2650)
它有重复列名的问题
看见
rbindlist
可以处理lists
、data.frames
和data.tables
,并将返回一个数据.不带行名的表
你可以用do.call(rbind, list(...))
来搞乱行名
How to avoid renaming of rows when using rbind inside do.call?
就内存而言,rbindlist
是在C
中实现的,内存效率也是如此,它使用setattr
通过引用来设置属性
rbind.data.frame
在R
中实现,它执行大量赋值,并使用attr<-
(以及class<-
和rownames<-
),所有这些都将(在内部)创建所创建数据的副本.框架