2014-02-09 3 views
0

У меня есть разреженная матрица представлена ​​в видеКак преобразовать эту разреженную матрицу в обычную?

> (f <- data.frame(row=c(1,2,3,1,2,1,2,3,4,1,1,2),value=1:12)) 
    row value 
1 1  1 
2 2  2 
3 3  3 
4 1  4 
5 2  5 
6 1  6 
7 2  7 
8 3  8 
9 4  9 
10 1 10 
11 1 11 
12 2 12 

Здесь первый столбец всегда присутствует (на самом деле, первые немногие из них присутствуют, остальные не являются).

Я хочу, чтобы получить данные в формате матрицы:

> t(matrix(c(1,2,3,NA,4,5,NA,NA,6,7,8,9,10,NA,NA,NA,11,12,NA,NA),nrow=4,ncol=5)) 
    [,1] [,2] [,3] [,4] 
[1,] 1 2 3 NA 
[2,] 4 5 NA NA 
[3,] 6 7 8 9 
[4,] 10 NA NA NA 
[5,] 11 12 NA NA 

Вот что, кажется, работает:

> library(Matrix) 
> as.matrix(sparseMatrix(i = cumsum(f[[1]] == 1), j=f[[1]], x=f[[2]])) 
    [,1] [,2] [,3] [,4] 
[1,] 1 2 3 0 
[2,] 4 5 0 0 
[3,] 6 7 8 9 
[4,] 10 0 0 0 
[5,] 11 12 0 0 

Кроме того, что я должен заменить 0 с NA себя.

Есть ли лучшее решение?

+0

Ничего страшного. Я только ставил под вопрос использование 'as.matrix' и' NA'. Если вы действительно работаете с большой разреженной матрицей, вы должны остановиться на 'sparseMatrix'. – flodel

+0

@flodel: он невелик и это не матрица. Я использую 'sparseMatrix' для синтаксического анализа. – sds

ответ

2

Вы можете делать все с помощью функций base. Хитрость заключается в том, чтобы использовать индексацию с помощью 2-Col (строки и индексы Col) матрица:

j <- f$row 
i <- cumsum(j == 1) 
x <- f$value 
m <- matrix(NA, max(i), max(j)) 
m[cbind(i, j)] <- x 
m 

ли она лучше или нет, чем использование Matrix пакета субъективно. Overkill, на мой взгляд, если вы ничего не делаете с этим. Кроме того, если ваши данные имели 0 в столбце f $ value, они были бы преобразованы в NA, если вы не слишком осторожны.

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