2012-03-23 4 views
4

Это расширение существующего вопроса: Convert table into matrix by column namesR - преобразование BIG таблицы в матрицу по именам столбцов

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

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

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

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

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

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

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

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

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

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

+0

Попробуйте использовать 'sparseMatrix' из пакета' Matrix'. – flodel

+3

Функция 'reshape' не предназначена для построения матрицы спарнов, независимо от того, какие жертвы вы делаете для _deus_ex_machina_. И нет «матричного» пакета. Если вы спрашиваете о пакете «Матрица», пожалуйста, напишите его правильно. –

+1

http://stackoverflow.com/a/9617424/210673 имеет список различных способов сделать это. – Aaron

ответ

3

Я хотел бы использовать функцию 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)) 
+0

Спасибо. Это очень полезно! – Wallace

1

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

Смежные вопросы