R - преобразовать БОЛЬШУЮ таблицу в матрицу по именам столбцов - PullRequest
4 голосов
/ 23 марта 2012

Это расширение существующего вопроса: Преобразование таблицы в матрицу по именам столбцов

Я использую окончательный ответ: https://stackoverflow.com/a/2133898/1287275

Исходный CSVМатрица файла имеет около 1,5 млн строк с тремя столбцами ... индекс строки, индекс столбца и значение.Все числа являются длинными целыми числами.Базовая матрица представляет собой разреженную матрицу размером около 220K x 220K со средним значением около 7 значений в строке.

Оригинальная таблица read.table работает просто отлично.

  x <- read.table("/users/wallace/Hadoop_Local/reference/DiscoveryData6Mo.csv", header=TRUE);

Моя проблема возникает, когда я выполняю команду изменения формы.

  reshape(x, idvar="page_id", timevar="reco", direction="wide")

Процессор достигает 100%, и он остается навсегда.Машина (Mac) имеет больше памяти, чем R использует.Я не понимаю, почему на создание разреженной матрицы уходит так много времени.

Я использую пакет матрицы по умолчанию.Я не установил ничего лишнего.Я только что скачал R несколько дней назад, поэтому у меня должна быть последняя версия.

Предложения?

Спасибо, Уоллес

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

Я бы использовал функцию 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))
1 голос
/ 23 марта 2012

Самый простой способ сделать это в базе 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.

...