2017-07-07 17 views
0

私はdata.frameに2つの列を持っています。 1つはオブジェクトを示し、もう1つはオブジェクトがあるグループ内にあるかどうかを示します。ループを作成せずに隣接行列を作成するにはどうすればよいですか?バイナリ変数に基づいて隣接行列を作成する

data("mtcars") 
testdf <- data.frame(names=as.character(row.names(mtcars)[1:5]), 
       ingroup=0) 

set.seed(123) 
testdf$ingroup[testdf$names%in%row.names(mtcars)[sample(length(row.names(mtcars)[1:5]), 2)]] <- 1 

testdf 
       names ingroup 
1   Mazda RX4  0 
2  Mazda RX4 Wag  1 
3  Datsun 710  0 
4 Hornet 4 Drive  1 
5 Hornet Sportabout  0 

EDIT:オブジェクトは、特定のグループ内にある場合、所望の出力を示す行列であるべきである。

data.frame(x1=c(0,0,0,0,0), 
     x2=c(0,1,0,0,1), 
     x3=c(0,0,0,0,0), 
     x4=c(0,0,0,0,0), 
     x5=c(0,1,0,0,1)) 
colnames(output) <- c("Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", "Mazda RX4","Mazda RX4 Wag") 
rownames(output) <- c("Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", "Mazda RX4","Mazda RX4 Wag") 

output 
        Datsun 710 Hornet 4 Drive Hornet Sportabout Mazda RX4 Mazda RX4 Wag 
Datsun 710     0    0     0   0    0 
Hornet 4 Drive    0    1     0   0    1 
Hornet Sportabout   0    0     0   0    0 
Mazda RX4     0    0     0   0    0 
Mazda RX4 Wag    0    1     0   0    1 

おかげで、トーマス

+0

私の解決策が期待される出力を与えていないと言った理由がわかりません。あなたの例と期待された結果によると、それは同じものを与えています – akrun

+0

私は避けようとしたのと同じ間違いをしました。ごめんなさい。 'testdf'で見ることができるように、Datsun710は' 1'を得るべきではありません。 'tcrossprod(tbl)'を使うことで、私が欲しいものの正反対を得ることができます。 'tcrossprod(tbl [、2])を使うことで、私は自分が望むものを得ることができます。右?混乱させて申し訳ありません。 – Thomas

答えて

0

ちょうどの外積を取りますingroup変数:

res <- tcrossprod(testdf$ingroup) 
rownames(res) <- testdf$names 
colnames(res) <- testdf$names 
res 

# Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive Hornet Sportabout 
# Mazda RX4     0    0   0    0     0 
# Mazda RX4 Wag    0    1   0    1     0 
# Datsun 710    0    0   0    0     0 
# Hornet 4 Drive   0    1   0    1     0 
# Hornet Sportabout   0    0   0    0     0 
関連する問題