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.