2016-07-14 9 views
2

私は次のように3つのベクトルがあります。R - 3生のベクトルから行列を作成

A <- c("A", "B", "C", "D", "E") 
B <- c("1/1/1", "1/1/1", "2/1/1", "2/1/1", "3/1/1") 
C <- c(1, 1, -1, 1, -1) 

を、私はこれらの3つのベクトル使用して、以下のような行列を作成したい:

- 1/1/1 2/1/1 3/1/1 
A 1 0  0 
B 1 0  0 
C 0 -1 0 
D 0 1  0 
E 0 0  -1 

ベクトルをABはそれぞれ行と列で、データはCです。 ご協力いただければ幸いです。

+0

HTTPの複製に非常に近い://払い戻しの手続き/ 37739840/in-r-two-way-match-to-mat rix/37739993 – thelatemail

答えて

5

あなたが試すことができます。

`[<-`(array(0,c(length(unique(A)),length(unique(B))), 
     list(unique(A),unique(B))), 
     cbind(A,B),C) 
# 1/1/1 2/1/1 3/1/1 
#A  1  0  0 
#B  1  0  0 
#C  0 -1  0 
#D  0  1  0 
#E  0  0 -1 
+0

コードの動作を簡単に説明できますか? –

+2

'[< - '(A、cbind(i、j)、C)'は 'A [cbind(i、j)] < - C'であると考えるかもしれません。 – kitman0804

6

使用?xtabs

xtabs(C ~ A+B) 
# B 
#A 1/1/1 2/1/1 3/1/1 
# A  1  0  0 
# B  1  0  0 
# C  0 -1  0 
# D  0  1  0 
# E  0  0 -1 
+2

これはブームです。 –

2

別のオプションは、作成後reshape2からacastあるdata.frame

library(reshape2) 
acast(data.frame(A, B, C), A~B, value.var = "C", fill =0) 
# 1/1/1 2/1/1 3/1/1 
#A  1  0  0 
#B  1  0  0 
#C  0 -1  0 
#D  0  1  0 
#E  0  0 -1 
関連する問題