R - преобразовать таблицу BIG в матрицу по именам столбцов
Это расширение существующего вопроса: Преобразование таблицы в матрицу по именам столбцов
Я использую окончательный ответ: qaru.site/info/43123/...
Оригинальная матрица файлов CSV имеет около 1,5 М строк с тремя столбцами... индекс строки, индекс столбца и значение. Все числа являются длинными целыми числами. Основная матрица представляет собой разреженную матрицу размером около 220K x 220K со средним значением около 7 значений в строке.
Оригинал read.table работает просто отлично.
x <- read.table("/users/wallace/Hadoop_Local/reference/DiscoveryData6Mo.csv", header=TRUE);
Моя проблема возникает, когда я делаю команду reshape.
reshape(x, idvar="page_id", timevar="reco", direction="wide")
Процессор достигает 100%, и там он сидит вечно. Машина (mac) имеет больше памяти, чем используется R. Я не понимаю, почему так долго нужно строить разреженную матрицу.
Я использую пакет матрицы по умолчанию. Я ничего не установил. Я просто скачал R несколько дней назад, поэтому у меня должна быть последняя версия.
Предложения?
Спасибо,
Уоллес
Ответы
Ответ 1
Я бы использовал функцию sparseMatrix
из пакета Matrix
. Типичное использование sparseMatrix(i, j, x)
, где i
, j
и x
- три вектора одинаковой длины: соответственно, индексы строк, индексы столбцов и значения ненулевых элементов в матрице. Вот пример, где я попытался сопоставить имена переменных и размеры с вашими спецификациями:
num.pages <- 220000
num.recos <- 230000
N <- 1500000
df <- data.frame(page_id = sample.int(num.pages, N, replace=TRUE),
reco = sample.int(num.recos, N, replace=TRUE),
value = runif(N))
head(df)
# page_id reco value
# 1 33688 48648 0.3141030
# 2 78750 188489 0.5591290
# 3 158870 13157 0.2249552
# 4 38492 56856 0.1664589
# 5 70338 138006 0.7575681
# 6 160827 68844 0.8375410
library("Matrix")
mat <- sparseMatrix(i = df$page_id,
j = df$reco,
x = df$value,
dims = c(num.pages, num.recos))
Ответ 2
Самый простой способ сделать это в базе R - с индексированием матрицы, например:
# make up data
num.pages <- 100
num.recos <- 100
N <- 300
set.seed(5)
df <- data.frame(page_id = sample.int(num.pages, N, replace=TRUE),
reco = sample.int(num.recos, N, replace=TRUE),
value = runif(N))
# now get the desired matrix
out <- matrix(nrow=num.pages, ncol=num.recos)
out[cbind(df$page_id, df$reco)] <- df$value
Однако в этом случае ваша результирующая матрица будет 220k * 220k, что потребует больше памяти, чем у вас, поэтому вам нужно использовать пакет специально для разреженных матриц, как описывает @flodel.