Если ваш набор общих ключей / индексов полностью перекрывается, то есть ...
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.)