До того ж v1.9.2
, rbindlist
розвинувся зовсім небагато, реалізуючи багато функцій, зокрема:
- Вибір найвищих
SEXPTYPE
стовпців під час прив’язки - реалізований у v1.9.2
закритті FR # 2456 та Bug № 4981 .
factor
Правильне поводження зі стовпцями - спочатку реалізовано у v1.8.10
закритті помилки № 2650 та розширено до впорядкованих упорядкованих факторів v1.9.2
, а також закриваючи FR # 4856 та помилку № 5019 .
Крім того, в v1.9.2
, rbind.data.table
також, отримано fill
аргумент, який дозволяє прив'язувати, заповнюючи пропущені стовпці, реалізовані в Р.
Зараз у v1.9.3
цій галузі є ще більше вдосконалень щодо цих існуючих функцій:
rbindlist
отримує аргумент use.names
, який за замовчуванням призначений FALSE
для зворотної сумісності.
rbindlist
також отримує аргумент fill
, який за замовчуванням також є FALSE
для зворотної сумісності.
- Усі ці функції реалізовані на C і написані обережно, щоб не погіршити швидкість, додаючи функціональні можливості.
- Оскільки
rbindlist
тепер можна збігатися за іменами та заповнювати пропущені стовпці, rbind.data.table
просто rbindlist
зараз телефонуйте . Єдина відмінність полягає в тому, що use.names=TRUE
за замовчуванням rbind.data.table
для зворотної сумісності.
rbind.data.frame
сповільнюється зовсім небагато, в основному завдяки копіям (на які вказує і @mnel), яких можна було уникнути (перейшовши на C). Я думаю, що це не єдина причина. Реалізація для перевірки / узгодження імен стовпців у програмі rbind.data.frame
також може бути повільнішою, коли для даних dataframe є багато стовпців і існує багато таких фреймів data.frames (як показано на еталоні нижче).
Однак, rbindlist
відсутність (редагування) певних особливостей (наприклад, перевірка рівнів коефіцієнтів чи відповідність імен) має дуже малу (або відсутність) ваги щодо того, щоб він був швидшим, ніж rbind.data.frame
. Це тому, що вони були ретельно реалізовані на C, оптимізовані для швидкості та пам’яті.
Ось орієнтир, який підкреслює ефективне прив'язування під час узгодження за назвами стовпців, а також за допомогою функції rbindlist
's use.names
від v1.9.3
. Набір даних складається з 10000 кадрів data.fram розміром 10 * 500.
Примітка: цей показник було оновлено, щоб включати порівняння з dplyr
"s"bind_rows
library(data.table) # 1.11.5, 2018-06-02 00:09:06 UTC
library(dplyr) # 0.7.5.9000, 2018-06-12 01:41:40 UTC
set.seed(1L)
names = paste0("V", 1:500)
cols = 500L
foo <- function() {
data = as.data.frame(setDT(lapply(1:cols, function(x) sample(10))))
setnames(data, sample(names))
}
n = 10e3L
ll = vector("list", n)
for (i in 1:n) {
.Call("Csetlistelt", ll, i, foo())
}
system.time(ans1 <- rbindlist(ll))
# user system elapsed
# 1.226 0.070 1.296
system.time(ans2 <- rbindlist(ll, use.names=TRUE))
# user system elapsed
# 2.635 0.129 2.772
system.time(ans3 <- do.call("rbind", ll))
# user system elapsed
# 36.932 1.628 38.594
system.time(ans4 <- bind_rows(ll))
# user system elapsed
# 48.754 0.384 49.224
identical(ans2, setDT(ans3))
# [1] TRUE
identical(ans2, setDT(ans4))
# [1] TRUE
Обв'язування стовпців як таких, не перевіряючи імена, займало лише 1,3, а для перевірки імен стовпців та прив’язки потрібно було лише 1,5 секунди більше. Порівняно з базовим рішенням, це в 14 разів швидше і на 18 разів швидше, ніж dplyr
у версії.
attr<-
,class<-
і (я думаю)rownames<-
всі зміни на місці.