15

Rでスパース行列を操作するためのオプションについて学習した後、 Matrixパッケージを使用して、次のデータフレームからスパース行列を作成し、他のすべての要素をにしたいと思います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 

このマトリックスをどのように作成する必要がありますか?1つのマトリックスの操作が非常に遅いのはなぜですか?

上記のデータのコードスニペットは次のとおりです。

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")
4

2 に答える 2

16

なぜデフォルトのNA値が必要なのですか?私の知る限り、行列はセルがゼロの場合にのみスパースになります。NAはゼロ以外の値であるため、スパース行列からのすべての利点が失われます。行列にゼロがほとんどない場合、古典的な行列はさらに効率的です。古典的な行列は、次元に応じてカットされるベクトルのようなものです。したがって、データベクトルとディメンションを保存するだけで済みます。スパース行列は、ゼロ以外の値のみを格納しますが、場所も格納します。これは、ゼロ値が十分にある場合にのみ有利です。

于 2009-08-13T19:57:17.940 に答える
11

はい、ティエリーの答えは間違いなく真実です。「マトリックス」パッケージの共同作成者として言えます...

あなたの他の質問へ:「M」へのアクセスが「Y」よりも遅いのはなぜですか? 主な答えは、「M」は「Y」よりもはるかにまばらであるため、はるかに小さく、含まれるサイズとプラットフォームのRAMに応じて、アクセス時間ははるかに小さいオブジェクト、特にそれらへのインデックス作成の場合により高速です。 .

于 2009-08-24T10:01:50.133 に答える