Эффективные альтернативы слияния для больших данных. Кадры R
Я ищу эффективный (как компьютерный ресурс, так и метод обучения/реализации), чтобы объединить два больших (размеp > 1 миллион /300 КБ файлов данных RData).
"merge" в базе R и "join" в plyr, по-видимому, используют всю мою память, эффективно разбивая мою систему.
Пример
load тестовый кадр данных
и попробуйте
test.merged<-merge(test, test)
или
test.merged<-join(test, test, type="all")
Следующая публикация содержит список слияний и альтернатив:
Как объединить кадры данных (внутренние, внешние, левые, правые)?
Следующее позволяет проверить размер объекта:
https://heuristically.wordpress.com/2010/01/04/r-memory-usage-statistics-variable/
Данные, созданные аноним
Ответы
Ответ 1
Здесь обязательный пример data.table
:
library(data.table)
## Fix up your example data.frame so that the columns aren't all factors
## (not necessary, but shows that data.table can now use numeric columns as keys)
cols <- c(1:5, 7:10)
test[cols] <- lapply(cols, FUN=function(X) as.numeric(as.character(test[[X]])))
test[11] <- as.logical(test[[11]])
## Create two data.tables with which to demonstrate a data.table merge
dt <- data.table(test, key=names(test))
dt2 <- copy(dt)
## Add to each one a unique non-keyed column
dt$X <- seq_len(nrow(dt))
dt2$Y <- rev(seq_len(nrow(dt)))
## Merge them based on the keyed columns (in both cases, all but the last) to ...
## (1) create a new data.table
dt3 <- dt[dt2]
## (2) or (poss. minimizing memory usage), just add column Y from dt2 to dt
dt[dt2,Y:=Y]
Ответ 2
Ниже приведены некоторые тайминги для методов data.table и data.frame.
Использование data.table происходит намного быстрее. Что касается памяти, я могу неофициально сообщить, что эти два метода очень похожи (в пределах 20%) в использовании ОЗУ.
library(data.table)
set.seed(1234)
n = 1e6
data_frame_1 = data.frame(id=paste("id_", 1:n, sep=""),
factor1=sample(c("A", "B", "C"), n, replace=TRUE))
data_frame_2 = data.frame(id=sample(data_frame_1$id),
value1=rnorm(n))
data_table_1 = data.table(data_frame_1, key="id")
data_table_2 = data.table(data_frame_2, key="id")
system.time(df.merged <- merge(data_frame_1, data_frame_2))
# user system elapsed
# 17.983 0.189 18.063
system.time(dt.merged <- merge(data_table_1, data_table_2))
# user system elapsed
# 0.729 0.099 0.821
Ответ 3
Вам нужно выполнить слияние в R? Если нет, объедините основные файлы данных, используя простую конкатенацию файлов, а затем загрузите их в R. (Я понимаю, что это может не относиться к вашей ситуации, но если это произойдет, это может сэкономить вам много головной боли.)