学习有关选项中的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”非常非常稀疏,因此小得多, - 根据envolved的大小和你的平台的内存 - 访问时间是非常小的物体速度更快,特别是用于索引放进去

其他提示

为什么要默认NA值?据我知道,如果他们有零细胞矩阵是只有稀稀拉拉。由于NA是一个非零值,你失去从稀疏矩阵的所有好处。一个典型的矩阵是更有效的,如果基体几乎没有任何零。一个典型的基体是这样的将根据尺寸被切割的载体。因此,只需要存储的数据载体和尺寸。只有稀疏矩阵存储非零值,而且还存储有位置。这是一个优点,当且仅如果你有足够的零值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top