Объединить кадры данных в R в предварительно отсортированном столбце? - PullRequest
6 голосов
/ 28 октября 2011

Я обычно работаю с большими фреймами данных, которые довольно хорошо отсортированы (или могут быть легко отсортированы).

Учитывая два фрейма данных, оба отсортированы по 'user'

some.data <user> <data_1> <data_2> 
user <user> <user_attr_1> <user_attr_2>

И я запускаюm = merge(some.data,user), я получаю результат как:

m = <user> <data_1> <data_2> <user_attr_1> <user_attr_2>

И это нормально, так что.

Но merge не использует преимущества этих фреймов данных, отсортированных по общему столбцуСлияние довольно процессор / память тяжелая.Однако это слияние может быть выполнено в O (n)

Мне интересно, есть ли способ в R для эффективного слияния отсортированных наборов данных?

Ответы [ 2 ]

5 голосов
/ 28 октября 2011

У меня нет никакого опыта с этим, но, насколько я знаю, это одна из проблем, которую пакет data.table был разработан для улучшения.

Для большинства практических целей data.table = data.frame + index. Как следствие, при правильном использовании это повышает производительность многих крупных операций.

Существует опасность, что преобразование data.frame в data.table (то есть добавление индекса) может занять некоторое время (хотя я ожидаю, что это будет хорошо оптимизировано), но как только вы его настроите, функции будут такими: Объединение может легко использовать индекс для повышения производительности.

0 голосов
/ 29 октября 2011

Если ваш набор общих ключей / индексов полностью перекрывается, то есть ...

Reduce(`&`, user$user.id %in% some.data$user.id)

... возвращает TRUE, и они, как вы сказали, отсортированы, , а дубликатов ключей нет , тогда ваша проблема слияния сводится к добавлению столбцов в data.frame. Что-то в линиях вдоль ...

library(log4r)

t1 <- system.time(z <- merge(user, some.data, by='user.id'))

info(my.logger, paste('Elapsed time with merge():', t1['elapsed']))

t2 <- Sys.time()

r <- data.frame(user.id=user$user.id, V1.x=user$V1, V2.x=user$V2)

r[,names(some.data)] <- some.data[,names(some.data)

t3 <- Sys.time()

info(my.logger, paste('Elapsed time without:', t3-t2))

Если приведенные выше допущения не выполняются, то получается несколько более сложное объединение наборов ключей (функция перевода, заполнение NA), но только одно предположение о слиянии и перекрытии продвигает вас далеко вперед.

Также обратите внимание, что время подхода секунд смещено, поскольку он вызывает дважды Sys.time () в отличие от времени слияния (), которое вызывает system.time (), и только один раз. (Прошу прощения за неуместное использование наценки S.O.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...