我如何将表转置为矩阵

Han*_*nah 5 r

我有一个数据框,如下所示:

n1    n2   freq  
A     B     10
W     Q      9
A     E     23
A     F     31
A     W      9
B     Q      25
B     E      54
B     F      33
B     W      14
A     Q      4
F     E      1
E     W      43
Q     E      67
F     W      10
Q     F      6
Run Code Online (Sandbox Code Playgroud)

如何将数据转置为这样的矩阵?

     A   B   E   F    W    Q 
A    1  10  23  31    9    4
B   10   1  54  33   14   25
E   23  54   1   1   43   67
F   31  33   1   1   10    6
W    9  14  43  10    1    9
Q    4  25  67   6    9    1
Run Code Online (Sandbox Code Playgroud)

diag(data) <- 1

42-*_*42- 0

使用因子水平作为矩阵分配的索引:

dat <- read.table(text="n1    n2   freq  
A     B     10
W     Q      9
A     E     23
A     F     31
A     W      9
B     Q      25
B     E      54
B     F      33
B     W      14
A     Q      4
F     E      1
E     W      43
Q     E      67
F     W      10
Q     F      6", header=TRUE, stringsAsFactors=FALSE)

levs <- sort(unique(c(dat$n1,dat$n2)))
dat$n1 <- factor(dat$n1, levels=levs)
dat$n2 <- factor(dat$n2, levels=levs)
M <- matrix(1, nrow=length(levs), ncol=length(levs) )
M[with(dat, cbind(n1,n2))] <- dat$freq  # Mostly the upper triangle, save 3.

> M
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   10   23   31    4    9
[2,]    1    1   54   33   25   14
[3,]    1    1    1    1    1   43
[4,]    1    1    1    1    1   10
[5,]    1    1   67    6    1    1
[6,]    1    1    1    1    9    1

M[with(dat, cbind(n2,n1))] <- dat$freq  # The mirror image
dimnames(M)  <- list(levs,levs)
#-------
> M
   A  B  E  F  Q  W
A  1 10 23 31  4  9
B 10  1 54 33 25 14
E 23 54  1  1 67 43
F 31 33  1  1  6 10
Q  4 25 67  6  1  9
W  9 14 43 10  9  1
Run Code Online (Sandbox Code Playgroud)