#r #dataframe #datatable
#r #фрейм данных #datatable
Вопрос:
У меня есть 2 фрейма данных в R, как показано ниже
Фрейм данных 1
structure(list(X1 = c(1, 4, 3), X2 = c(2, 1, 2), X3 = c(3, 1,
1)), class = "data.frame", row.names = c(NA, -3L))
Фрейм данных 2
structure(list(X1 = c(0.5, 0.1), X2 = c(0.7, 0.2), X3 = c(0.3,
0.2)), class = "data.frame", row.names = c(NA, -2L))
Я хочу умножить каждую строку DF1 на каждую строку DF2 и выполнить некоторые вычисления, как показано ниже. Это своего рода умножение матрицы вместе с дополнительными вычислениями
- После умножения матрицы я буду вычислять
1/(1 exp(-x))
для каждой ячейки в результирующей матрице - и, наконец, возьмите сумму столбцов матрицы
Приведенный выше набор данных — это просто фиктивный набор. На самом деле DF1 содержит 1,1 миллиона строк, а DF2 — 65000 строк. При выполнении умножения матрицы я получаю сообщение об ошибке
cannot allocate vector of Size 560 GB
Есть ли какая-либо альтернатива этому. Кроме того, я ищу эффективное по времени решение из-за больших фреймов данных.
Может быть таблица данных?
Спасибо,
Комментарии:
1. Сколько там столбцов? Если объем ваших данных составляет 560 ГБ, вы, возможно, вообще не сможете поместить их в память. Каковы типы данных — в вашем примере я вижу целые числа и числа с плавающей запятой. Есть ли какой-нибудь способ сделать их целыми и, если возможно, ограничить их размеры? (это может немного помочь, но не настолько)
2. DF1 содержит 1,1 миллиона строк и 16 столбцов, DF2 — 65000 строк и 16 столбцов. Тип данных — float.
3. Поскольку вы выполняете арифметику, а не матричное умножение, кажется, вы могли бы выполнять вычисления кусочно. Т.Е. меньшими подмножествами строк. И просто объедините конечные результаты в конце.
4. Дорогой, о, дорогой. Если в DF1 и DF2 было только по 1 столбцу, и вы хотели взять все комбинации их строк, результирующий DF будет иметь 16K * 1,1M = ~ 17G строк. 4 байта на строку (32-битное целое число), и у нас 68 ГБ памяти. Теперь умножьте это на 16, и у нас будет ~ 1088 ГБ памяти. К этому моменту я несколько удивлен, что выделенный вектор был только половинного размера. И к этому моменту у нас заканчивается не только память, но и дисковое пространство. Пожалуйста, поправьте меня, если моя салфетка-математика была где-то отключена ^^.
5. Я понимаю проблему. Есть ли какое-либо другое альтернативное решение для этого?