2016-10-24 9 views
1

対称バイナリ行列の構築:私はそれはそれのdimnamesだ対称バイナリ行列を作りたいは、私はこのような例のためにある行列持っ

rownames V1 
a 1 
c 3 
b 2 
d 4 
y 2 
q 4 
i 1 
j 1 
r 3 

は上記行列のrownamesと同じです。私は1は誰がどのように知っている

dimnames  
    a c b d y q i j r 
a 1 0 0 0 0 0 1 1 0 
c 0 1 0 0 0 0 0 0 1 
b 0 0 1 0 1 0 0 0 0 
d 0 0 0 1 0 1 0 0 0 
y 0 0 1 0 1 0 0 0 0 
q 0 0 0 1 0 1 0 0 0 
i 1 0 0 0 0 0 1 1 0 
j 1 0 0 0 0 0 1 1 0 
r 0 1 0 0 0 0 0 0 1 

のような反対situation.This行列のためにそれの前の同じ番号を持つ変数と0を配置することになる示されたように1 & 0することにより、これらの行列を埋めるためにしたいですそれをしてもいいですか?

+0

先頭に同じ番号を持つ最初のマトリックスの各ローン名は、1番目の2番目のマトリックスを得ます。たとえば、 "b"、 "y"の前に2という数字があるので、 "b"と "y"の配列で2番目の行列に1を入れます。 "a"と "b" bczの配列には0を入れます。@ ZheyuanLi – minoo

+0

あなたの前には同じ値がありません。間違いでした。 – minoo

答えて

4

使用dist

DF <- read.table(text = "rownames V1 
       a 1 
       c 3 
       b 2 
       d 4 
       y 2 
       q 4 
       i 1 
       j 1 
       r 3", header = TRUE) 

res <- as.matrix(dist(DF$V1)) == 0L 
#alternatively: 
#res <- !as.matrix(dist(DF$V1)) 
#diag(res) <- 0L #for the first version of the question, i.e. a zero diagonal 
res <- +(res) #for the second version, i.e. to coerce to an integer matrix 
dimnames(res) <- list(DF$rownames, DF$rownames) 
# 1 2 3 4 5 6 7 8 9 
#1 1 0 0 0 0 0 1 1 0 
#2 0 1 0 0 0 0 0 0 1 
#3 0 0 1 0 1 0 0 0 0 
#4 0 0 0 1 0 1 0 0 0 
#5 0 0 1 0 1 0 0 0 0 
#6 0 0 0 1 0 1 0 0 0 
#7 1 0 0 0 0 0 1 1 0 
#8 1 0 0 0 0 0 1 1 0 
#9 0 1 0 0 0 0 0 0 1 
+0

@ZheyuanLiは、問題の素晴らしい解決策です!これは多くの人にとって貴重なものですので、私はあなたに返事をすることをお勧めします! – nadizan

+0

ありがとうございます@ローランド私はres行列1の直径を置くと正しい答えになると思います。本当にありがとう。 – minoo

+0

@minoo私はあなたのコメントを理解していません。私はあなたの期待される出力を再現しました。マトリックスの「直径」とは何ですか?編集:心配しないでください。私の編集を参照してください。 – Roland

3

あなたがtablecrossprodを使用してこれを行うことができます。

tcrossprod(table(DF))  
#   rownames 
# rownames a b c d i j q r y 
#  a 1 0 0 0 1 1 0 0 0 
#  b 0 1 0 0 0 0 0 0 1 
#  c 0 0 1 0 0 0 0 1 0 
#  d 0 0 0 1 0 0 1 0 0 
#  i 1 0 0 0 1 1 0 0 0 
#  j 1 0 0 0 1 1 0 0 0 
#  q 0 0 0 1 0 0 1 0 0 
#  r 0 0 1 0 0 0 0 1 0 
#  y 0 1 0 0 0 0 0 0 1 

彼らはあなたのデータならば、むしろアルファベットよりも、あなたが

tcrossprod(table(DF))[DF$rownames, DF$rownames] 

または使用率

tcrossprod(table(factor(DF$rownames, levels=unique(DF$rownames)), DF$V1)) 

をサブセットすることができ、データに見つかったとして、あなたは、行と列の順序をしたい場合大または疎である場合は、前のように結果の表の順序を変更するのと同様の方法で、xtabsのスパース行列代数を使用できます。

Matrix::tcrossprod(xtabs(data=DF, ~ rownames + V1, sparse=TRUE)) 
関連する問題