0

のような行列を変換する方法

A 1 2 3
B 3 6 9
c 5 6 9
D 1 2 4

次のような形式に:

   1 2 3 4 5 6 7 8 9
1  0 2 1 1 0 0 0 0 0
2  0 0 1 1 0 0 0 0 0  
3  0 0 0 0 0 1 0 0 1    
4  0 0 0 0 0 0 0 0 0      
5  0 0 0 0 0 1 0 0 1           
6  0 0 0 0 0 0 0 0 2         
7  0 0 0 0 0 0 0 0 0           
8  0 0 0 0 0 0 0 0 0               
9  0 0 0 0 0 0 0 0 0               

私はそれを実装していますが、forループを使用していますRに内部関数があるのだろうか(たとえば、「適用」)

追加: 混乱して申し訳ありません。最初の行列は単にアイテム セットを意味し、アイテムのすべてのセットはペアになります。たとえば、最初のセットは "1 2 3" で、(1,2),(1,3) になります。 (2,3)、2 番目の行列に対応します。

別の質問: マトリックスが非常に大きく (10000000*10000000)、スパースな場合、スパース マトリックスまたは big.matrix を使用する必要がありますか?

ありがとう!

4

1 に答える 1

3

M から行名を削除すると、次のようになります。

m <- matrix(c(1,3,5,1,2,6,6,2,3,9,9,4), nrow=4)

> m
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    3    6    9
## [3,]    5    6    9
## [4,]    1    2    4

# The indicies that you want to increment in x, but some are repeated
# combn() is used to compute the combinations of columns
indices <- matrix(t(m[,combn(1:3,2)]),,2,byrow=TRUE)

# Count repeated rows
ones <- rep(1,nrow(indices))
cnt <-  aggregate(ones, by=as.data.frame(indices), FUN=sum)

# Set each value to the appropriate count
x <- matrix(0, 9, 9)
x[as.matrix(cnt[,1:2])] <- cnt[,3]

x

##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
##  [1,]    0    2    1    1    0    0    0    0    0
##  [2,]    0    0    1    1    0    0    0    0    0
##  [3,]    0    0    0    0    0    1    0    0    1
##  [4,]    0    0    0    0    0    0    0    0    0
##  [5,]    0    0    0    0    0    1    0    0    1
##  [6,]    0    0    0    0    0    0    0    0    2
##  [7,]    0    0    0    0    0    0    0    0    0
##  [8,]    0    0    0    0    0    0    0    0    0
##  [9,]    0    0    0    0    0    0    0    0    0
于 2013-03-28T04:00:21.580 に答える