gpt4 book ai didi

r - 为什么rbindlist是 "better"而不是rbind?

转载 作者:行者123 更新时间:2023-12-03 04:30:09 29 4
gpt4 key购买 nike

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

我想知道为什么 rbindlistrbind 更好,以及在哪些场景 rbindlist 真正优于 rbind >?

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

最佳答案

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进行大量检查,并将按名称进行匹配。 (即 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)

它存在重复列名的问题

Warning message: in rbindlist(allargs) : NAs introduced by coercion: possible bug in data.table? (Bug #2384)

<小时/>

rbind.data.frame 行名可能会令人沮丧

rbindlist可以处理lists data.framesdata.tables ,并将返回一个没有行名的 data.table

你可以使用 do.call(rbind, list(...)) 来获得困惑的行名。参见

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

<小时/>

内存效率

内存方面rbindlistC 中实现,内存效率也很高,它使用 setattr通过引用设置属性

rbind.data.frameR 中实现,它进行了大量的分配,并使用 attr<- (以及 class<-rownames<- 所有这些都将(内部)创建所创建的 data.frame 的副本。

关于r - 为什么rbindlist是 "better"而不是rbind?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15673550/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com