質問

オプションについて学習した後>、私が作成するマトリックスのパッケージを使用したいですスパース次のデータフレームの行列とすべての他の要素を有するが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

だけでなく、私は1つの要素にアクセスするのに非常に時間がかかることがわかり、ということ。

> 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")
役に立ちましたか?

解決

はい、ティエリーの答えは

...私は「マトリックス」パッケージの共著者として言えることは間違いなく事実であります

あなたの他の質問:なぜ、「Y」よりも遅い「M」にアクセスしていますか? 主な答えは、「M」は「Y」よりもはるかに疎であるので、多くは小さく、ということである - アクセス時間は、特にそれらにインデックス付けのために、より速くはるかに小さいオブジェクトのためである - envolvedサイズと、お使いのプラットフォームのRAMに応じて、ます。

他のヒント

なぜあなたはNA値をデフォルトにしたいですか?彼らはゼロのセルを持っている場合、私の知る限りでは行列が唯一のスパースです。 NAが非ゼロ値であるとして、あなたは疎行列からのすべての利点を失います。マトリックスはほとんどゼロを有する場合、古典的なマトリックスは一層効率的です。古典的なマトリックスは、寸法に応じて切断されるベクターのようなものです。だから、唯一のデータベクトルと大きさを保存しなければなりません。疎行列格納のみ非ゼロ値だけでなく、位置が記憶されています。これがあれば有利ですし、十分なゼロ値を持っている場合にのみます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top