Создание (и доступ) разреженной матрицы с NA записями по умолчанию
-
16-09-2019 - |
Вопрос
Узнав о варианты работы с разреженными матрицами в R, Я хочу использовать Матрица пакет для создания разреженной матрицы из следующего фрейма данных и чтобы все остальные элементы были NA
.
s r d
1 1089 3772 1
2 1109 190 1
3 1109 2460 1
4 1109 3071 2
5 1109 3618 1
6 1109 38 7
Я знаю, что могу создать разреженную матрицу со следующим доступом к элементам, как обычно:
> library(Matrix)
> Y <- sparseMatrix(s,r,x=d)
> Y[1089,3772]
[1] 1
> Y[1,1]
[1] 0
но если я хочу, чтобы значение по умолчанию было NA, я попробовал следующее:
M <- Matrix(NA,max(s),max(r),sparse=TRUE)
for (i in 1:nrow(X))
M[s[i],r[i]] <- d[i]
и получил эту ошибку
Error in checkSlotAssignment(object, name, value) :
assignment of an object of class "numeric" is not valid for slot "x" in an object of class "lgCMatrix"; is(value, "logical") is not TRUE
Мало того, я обнаружил, что доступ к элементам занимает гораздо больше времени.
> system.time(Y[3,3])
user system elapsed
0.000 0.000 0.003
> system.time(M[3,3])
user system elapsed
0.660 0.032 0.995
Как я должен создавать эту матрицу?Почему с одной матрицей работать намного медленнее?
Вот фрагмент кода для приведенных выше данных:
X <- structure(list(s = c(1089, 1109, 1109, 1109, 1109, 1109), r = c(3772,
190, 2460, 3071, 3618, 38), d = c(1, 1, 1, 2, 1, 7)), .Names = c("s",
"r", "d"), row.names = c(NA, 6L), class = "data.frame")
Решение
Да, ответ Тьерри определенно верен, я могу сказать как соавтор пакета "Матрица"...
К вашему другому вопросу:Почему доступ к "M" происходит медленнее, чем к "Y"?Основной ответ заключается в том, что "M" намного реже, чем "Y", следовательно, намного меньше и - в зависимости от используемых размеров и объема оперативной памяти вашей платформы - время доступа быстрее для гораздо меньших объектов, особенно для индексации в них.
Другие советы
Зачем вам нужны значения NA по умолчанию?Насколько я знаю, матрицы являются разреженными только в том случае, если в них есть нулевые ячейки.Поскольку NA является ненулевым значением, вы теряете все преимущества разреженной матрицы.Классическая матрица еще более эффективна, если в ней почти нет нулей.Классическая матрица подобна вектору, который будет обрезан в соответствии с размерами.Таким образом, он должен хранить только вектор данных и размеры.Разреженная матрица хранит только ненулевые значения, но также сохраняет там местоположение.Это преимущество тогда и только тогда, когда у вас достаточно нулевых значений.