Во-первых, я предполагаю, что у вас есть регулярная разреженная матрица, созданная с помощью пакета Matrix.То есть ненулевые записи кодируются с точки зрения их значений, столбцов и смещений строк.
Пакет Matrix имеет альтернативное представление разреженной матрицы в виде набора триплетов , гдененулевые значения кодируются в терминах их координат.Это в основном то, что вы хотите.Оказывается, преобразовать в эту форму легко;и затем вы можете превратить его в фрейм данных.
Одна бородавка заключается в том, что координаты начинаются с нуля (т. е. элементы в первой строке кодируются как строка 0
), что вы можете или не можетехотите преобразовать в единичные.
library(Matrix)
# some sample data
m <- rsparsematrix(12000, 12000, 1e-7)
# convert to triplet form
mm <- as(m, "dgTMatrix")
# convert to data frame: convert to 1-based indexing
data.frame(i=mm@i + 1, j=mm@j + 1, x=mm@x)
# i j x
#1 144 624 0.16
#2 3898 1106 -1.80
#3 11444 1395 0.89
#4 3981 2300 0.27
#5 3772 3602 -0.42
#6 2674 4058 0.79
#7 4446 4943 0.58
#8 4550 6629 0.82
#9 4125 6867 -0.86
#10 3151 7865 -0.42
#11 11590 8019 -0.96
#12 4808 9428 -1.30
#13 10453 11141 0.39
#14 11112 11592 -1.40
Если вы хотите, чтобы строка / столбец имена , а не числа:
data.frame(i=rownames(mm)[mm@i + 1], j=colnames(mm)[mm@j + 1], x=mm@x)