我有一个数据框,如下所示:
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
使用因子水平作为矩阵分配的索引:
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)