繁体   English   中英

数据帧变成对称矩阵,同时保留所有行和列

[英]Data frame into a symmetric matrix while keeping all row and column

问题R DataFrame转换成方形(对称)矩阵是关于将数据帧转换为对称矩阵,如下例所示:

# data
x <- structure(c(1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0), 
                 .Dim = c(3L,5L), 
                 .Dimnames = list(c("X", "Y", "Z"), c("A", "B", "C", "D", "E")))

x
#  A B C D E
#X 1 1 0 0 0
#Y 1 1 0 0 0
#Z 0 0 0 1 0

# transformation
x <- x %*% t(x)
diag(x) <- 1

x
#  X Y Z
#X 1 2 0
#Y 2 1 0
#Z 0 0 1

现在,我试图将列c("A", "B", "C", "D", "E")保留在矩阵中,如下所示:

#  X Y Z A B C D E
#X 1 0 0 1 1 0 0 0
#Y 0 1 0 1 1 0 0 0
#Z 0 0 1 0 0 0 1 0
#A 1 1 0 1 0 0 0 0
#B 1 1 0 0 1 0 0 0
#C 0 0 0 0 0 1 0 0
#D 0 0 1 0 0 0 1 0
#E 0 0 0 0 0 0 0 1

我敢肯定,有一种简单的方法可以做到类似于第一个转换,包括每种情况。 谁能提出解决方案?

先感谢您!

这只是一种增强,不是吗?

X <- as.matrix(x)
rbind(cbind(diag(nrow(X)), X), cbind(t(X), diag(ncol(X))))

逐步构建它:感谢@李哲源指出m <- diag(sum(dim(x))) -diag m <- diag(sum(dim(x)))

m <- diag(sum(dim(x)))
colnames(m) = rownames(m) = c(rownames(x),colnames(x))
m[dimnames(x)[[1]],dimnames(x)[[2]]] <- x
m[dimnames(x)[[2]],dimnames(x)[[1]]] <- t(x)

#  X Y Z A B C D E
#X 1 0 0 1 1 0 0 0
#Y 0 1 0 1 1 0 0 0
#Z 0 0 1 0 0 0 1 0
#A 1 1 0 1 0 0 0 0
#B 1 1 0 0 1 0 0 0
#C 0 0 0 0 0 1 0 0
#D 0 0 1 0 0 0 1 0
#E 0 0 0 0 0 0 0 1

您可以将其包装到一个函数中,然后调用它:

makeSymMat <-function(x) {
    x <- as.matrix(x)
    m <- diag(sum(dim(x)))
    colnames(m) = rownames(m) = c(rownames(x),colnames(x))
    m[dimnames(x)[[1]],dimnames(x)[[2]]] <- x
    m[dimnames(x)[[2]],dimnames(x)[[1]]] <- t(x)
    return(m)
}

makeSymMat(x)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM