3

いくつかのインデックスが繰り返されるインデックス I のマトリックスがあります。以下に例を示します。

インデックスと互換性のある次元を持つ別の行列 A があり、どこでも 0 に開始されます。私は次のようなことをしたいと思います

A[I] += 1

私は2つの問題に直面しています:

  1. A[I] = A[I] + 1非効率すぎる
  2. 行列Iには冗長なインデックスがあります。たとえば、行2と6は同一であり、取得したいと思いますA[1,2] = 2

部分的な答えは、最初の 2 つの列が積でunique(I)あり、3 番目の列がカウントの積である 3 列のマトリックスを作成することですが、その解決策もわかりません。ポインタやヘルプをいただければ幸いです。

> I is:
     [,1] [,2]
[1,]    1    1
[2,]    1    2
[3,]    1    3
[4,]    1    4
[5,]    1    1
[6,]    1    2
[7,]    1    3
4

2 に答える 2

3

これは、スパース行列メソッドを使用すると最も速くなる可能性があります(Matrixパッケージなどを参照)。

標準の行列を使用すると、関数を使用して同じ行を折りたたんでからxtabs、行列の割り当て(コメントに基づいて編集)を行うことができます。

I <- cbind(1, c(1:4,1:3))

tmp <- as.data.frame(xtabs( ~I[,1]+I[,2] ))

A <- matrix(0, nrow=5, ncol=5)
tmp2 <- as.matrix(tmp[,1:2])
tmp3 <- as.numeric(tmp2)
dim(tmp3) <- dim(tmp2)
A[ tmp3 ] <- tmp[,3]
A

as.data.frame.tableデータフレームに変換して再度戻すのではなく、コア機能を引き出して、少し速くすることができます。

これは、より効率的な別のバージョンです。xtabsいくつかの0を、 :によって計算された他の0で上書きします。

I <- cbind(1:5,1:5)
A <- matrix(0, 5, 5)

tmp <- xtabs( ~I[,2]+I[,1] )

A[ as.numeric(rownames(tmp)), as.numeric(colnames(tmp)) ] <- c(tmp)
A

A行列にdimnamesがあり、I行列にインデックスの代わりに名前がある場合、この後の行列も機能します(as.numericsを削除するだけです)。

于 2012-11-08T20:37:38.867 に答える
2

どうぞ:

## Reproducible versions of your A and I objects
A <- matrix(0, nrow=2, ncol=5)
## For computations that follow, you'll be better off having this as a data.frame
## (Just use `I <- as.data.frame(I)` to convert a matrix object I).
I <- read.table(text=" 1    1
1    2
1    3
1    4
1    1
1    2
1    3", header=FALSE)

## Create data.frame with number of times each matrix element should
## be incremented
I$count <- ave(I[,1], I[,1], I[,2], FUN=length)
I <- unique(I)

## Replace desired elements, using a two column matrix (the "third form of
## indexing" mentioned in "Matrices and arrays" section" of ?"[").
A[as.matrix(I[1:2])] <- I[[3]]

A
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    2    2    2    1    0
# [2,]    0    0    0    0    0
于 2012-11-08T20:35:40.710 に答える