#r #sparse-matrix #melt
#r #разреженная матрица #плавление
Вопрос:
У меня есть большой sparse matrix
( Matrix
dgCMatrix
объект пакета R
).
Игрушечный пример:
m <- Matrix(c(0,0,2:0), 3,5)
rownames(m) <- paste0("g",1:3)
colnames(m) <- paste0("c",1:3)
> m
3 x 5 sparse Matrix of class "dgCMatrix"
c1 c2 c3 c4 c5
g1 . 1 . . 2
g2 . . 2 . 1
g3 2 . 1 . .
И я хочу, чтобы melt
это было a data.frame
.
reshape2
для этого melt
требуется принудительное преобразование этого dgCMatrix
в matrix
объект, и для измерений, с которыми я работаю, это происходит очень медленно. Итак, я ищу что-то более эффективное.
Я думал mefa4
Melt
, что это сработает, но это отбрасывает нулевые значения:
> mefa4::Melt(m)
rows cols value
1 g3 c1 2
2 g1 c2 1
3 g2 c3 2
4 g3 c3 1
5 g1 c5 2
6 g2 c5 1
И я хотел бы сохранить их, и я не вижу параметра в mefa4::Melt
руководстве, обеспечивающего это. Есть идеи по альтернативе?
Комментарии:
1. Весь смысл разреженной матрицы в том, что в ней нет нулей.
Ответ №1:
данные:
m <- Matrix(c(0,0,2:0), 3,5)
rownames(m) <- paste0("g",1:3)
colnames(m) <- paste0("c",1:5)
Решение:
data.frame(rows=rownames(x)[row(x)],cols=colnames(x)[col(x)],value=as.numeric(x))
Кажется, это быстрее, чем reshape2
melt
принудительные matrix
и mefa4
Melt
:
mf <- function(x){
mefa4::Melt(x)
}
df <- function(x){
data.frame(rows=rownames(x)[row(x)],cols=colnames(x)[col(x)],value=as.numeric(x))
}
rs <- function(x){
reshape2::melt(Matrix::as.matrix(x))
}
microbenchmark::microbenchmark(df(m))
Unit: microseconds
expr min lq mean median uq max neval
df(m) 330.378 376.887 778.3489 476.903 699.743 14953.47 100
microbenchmark::microbenchmark(rs(m))
Unit: microseconds
expr min lq mean median uq max neval
rs(m) 537.328 638.683 1197.268 726.679 1042.261 15073.3 100
microbenchmark::microbenchmark(mf(m))
Unit: microseconds
expr min lq mean median uq max neval
mf(m) 459.947 526.6585 1023.575 677.9775 1007.214 6712.497 100