根据分类值制作相似行的热图

Making a heatmap of similar rows based on categorical values

在这个简单的示例中,我试图查看共享相同 class 的学生人数。这是我想出的,但我想知道如何在没有循环的情况下做到这一点,以及可能如何显示哪些学生(或位置 P1、P2、P3、P4)一起共享 class。如果这些是数字,我认为它可以简单地通过相关矩阵来完成,但考虑到分类性质,我不确定除此之外如何处理它。

DF <- (data.frame(row.names= c("ClassA", "ClassB","ClassC","ClassD","ClassE","ClassF"),
                 P1=c("John","John","Dave","Patrick","Steve","John"),
                 P2=c("Jim","Jim","Robert","Matt","Jim","Ben"),
                 P3=c("Marty","Mike","Stu","Geoff","Mike","Leif"),
                 P4=c("Mark","Mark","Tim","Moby","Chester","Larry")))


DFtally <- matrix(ncol=6, nrow=6)
for (i in 1:dim(DF)[1]) {
  for (j in 1:dim(DF)[1]) {
    DFtally[i,j] <- length(intersect(t(DF[i,]),t(DF[j,])))
  }
}

library(plotly)
p <- plot_ly(z = DFtally, type = "heatmap")
p

试试这个:

DF2 <- split(as.matrix(DF), 1:nrow(DF))
DF2 <- crossprod(table(stack(DF2)))
DF2

#      ind
#   ind 1 2 3 4 5 6
#     1 4 3 0 0 1 1
#     2 3 4 0 0 2 1
#     3 0 0 4 0 0 0
#     4 0 0 0 4 0 0
#     5 1 2 0 0 4 0
#     6 1 1 0 0 0 4