Мы можем использовать dplyr::summarize_all
# some sample data (different from yours, just to illustrate)
df_list = list(
data.frame(ID = c(123, 123, 234), x1 = c(1, 2, 3), x2 = 2:4),
data.frame(ID = c(123, 123, 234), x1 = c(1, 2, 3), x2 = 2:4, x3 = 4:6),
data.frame(ID = c(123, 123), x1 = c(1, 2), x3 = 2:3)
)
library(dplyr)
bind_rows(df_list) %>%
group_by(ID) %>%
summarize_all("sum", na.rm = TRUE)
# # A tibble: 2 x 4
# ID x1 x2 x3
# <dbl> <dbl> <int> <int>
# 1 123 9 10 14
# 2 234 6 8 6
Правки: поскольку вы сталкиваетесь с ограничениями памяти, лучшее, что вы можете сделать в dplyr
, - это агрегировать каждый кадр данных по отдельности,таким образом уменьшая его размер, прежде чем снова объединить и агрегировать.Я бы предложил простой for
циклический подход, чтобы не пытаться копировать все данные сразу:
for (i in seq_along(df_list)) {
df_list[[i]] = df_list[[i]] %>%
group_by(ID) %>%
summarize_all("sum", na.rm = TRUE)
}
# Then use the code from above
result = bind_rows(df_list) %>%
group_by(ID) %>%
summarize_all("sum", na.rm = TRUE)
Степень, в которой это поможет, полностью зависит от того, сколько повторений идентификаторов имеется в каждом фрейме данных,Если это по-прежнему не работает, то следующей попыткой будет использование data.table
, что позволяет вносить изменения на месте:
library(data.table)
for (i in seq_along(df_list)) {
setDT(df_list[[i]]) # convert data frames to data.tables
# pre-aggregate to reduce size
df_list[[i]] = df_list[[i]][ , lapply(.SD, sum, na.rm = TRUE), by = .(ID)]
}
# combine and aggregate
big_dt = rbindlist(df_list, fill = TRUE)
big_dt = big_dt[ , lapply(.SD, sum, na.rm = TRUE), by = .(ID)]
Решение data.table
должно быть достаточно эффективным с точки зрения памяти.Если у вас все еще возникают проблемы с памятью, убедитесь, что ваше рабочее пространство максимально пустое, и у вас нет других приложений, занимающих память.Если это не сработает, обратитесь к R-FAQ Невозможно выделить вектор размером n для дополнительных советов (таких как использование компьютера с большим объемом памяти или использование пакетов, позволяющих выполнять вычисления вне памяти).