使用`Matrix :: sparseMatrix` [R]制作稀疏矩阵时,列顺序错误

时间:2018-07-15 03:16:20

标签: r matrix sparse-matrix

我有一个类似于以下内容的数据框:

sparsed <- 
structure(list(Movie = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 
4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 7, 7, 8), User = c(32, 2, 56, 34, 
56, 89, 4, 2, 46, 89, 67, 56, 12, 35, 89, 2, 90, 12, 5, 78, 69, 
32, 64, 56, 2), Rating = c(1L, 3L, 2L, 4L, 5L, 3L, 2L, 3L, 4L, 
5L, 2L, 3L, 5L, 1L, 2L, 3L, 4L, 5L, 4L, 3L, 3L, 2L, 2L, 1L, 1L
)), .Names = c("Movie", "User", "Rating"), row.names = c(NA, 
-25L), class = "data.frame")

将值放入稀疏矩阵的逻辑是什么?为了将其放入尺寸正确的稀疏矩阵(8 x 15)中,我必须执行以下奇数转换,否则结果为8 x 90。

library(Matrix)    
sparsed$Movie <- as.factor(as.character(sparsed$Movie))
sparsed$User <- as.factor(as.character(sparsed$User))

sparse <- sparseMatrix(i = as.numeric(sparsed$Movie),
                       j = as.numeric(sparsed$User),
                       x = as.numeric(sparsed$Rating))

#8 x 15 sparse Matrix of class "dgCMatrix"

#[1,] . 3 1 . . . . . 2 . . . . . .
#[2,] . . . 4 . . . . 5 . . . . 3 .
#[3,] . 3 . . . 2 4 . . . 2 . . 5 .
#[4,] 5 . . . . . . . 3 . . . . . .
#[5,] 5 3 . . 1 . . 4 . . . . 3 2 4
#[6,] . . 2 . . . . . . . . 3 . . .
#[7,] . . . . . . . . 1 2 . . . . .
#[8,] . 1 . . . . . . . . . . . . .

我现在对尺寸感到满意,但是矩阵列的顺序不正确。例如,第一列对应于影片12,而不是2。行的顺序正确地按数字顺序。谁能解释一下?有什么好方法可以按正确的顺序排列列?

1 个答案:

答案 0 :(得分:0)

sparseMatrix没有做错任何事情。

在将sparsed列最终转换为因数之前,MovieUser是数字,所以2是2,12是12。max(Movie)是8并且{{ 1}}是90,因此您将获得8 x 90的矩阵。

将这些列转换为因子后,您是否知道因子水平?

max(User)

级别不匹配数字顺序,例如12领先于2。如果对这些因子进行levels(sparsed$Movie) #[1] "1" "2" "3" "4" "5" "6" "7" "8" levels(sparsed$User) #[1] "12" "2" "32" "34" "35" "4" "46" "5" "56" "64" "67" "69" "78" "89" "90" ,则第一个级别“ 12”将出现在第一矩阵列中,级别“ 32”将出现出现在第三列。如果希望它们以正确的数字顺序排列,请使用as.numeric而不是factor来控制电平:

as.factor