R创建计数和重复的对称矩阵

时间:2016-01-20 19:14:50

标签: r matrix duplicates

我有按班级学生注册的数据,我想计算一个矩阵,其中包含对角线上的总注册数和每个班级中双重注册的学生数。每行包括学生的姓名和他或她注册的课程。这里有一些假数据(有着名的爵士音乐家):

Class   Name
A   Jones
A   Smith
A   Johnson
A   Pastorius
B   Jones
B   Davis
B   Coltrane
B   Hancock
C   Smith
C   Shorter
C   Zawinul
C   Pastorius
C   Erskine

琼斯在A和B中双重注册,而史密斯和帕斯托里乌斯都在A和C中.B和C没有双重注册。输出矩阵应如下所示:

    A   B   C
A   4   1   2
B   1   4   0
C   2   0   5

理想情况下,代码适用于任意数量的类。我可以通过在代码中指定每对类来完成mysql和R中的计数,但是无法弄清楚如何使其可扩展以覆盖文件中的每个类。非常感谢您的意见和建议。

2 个答案:

答案 0 :(得分:1)

我们可以将tablecrossprod

一起使用
tcrossprod(table(df1))
#       Class
#Class A B C
#    A 4 1 2
#    B 1 4 0
#    C 2 0 5

数据

df1 <- structure(list(Class = c("A", "A", "A", "A", "B", 
 "B", "B", "B", 
"C", "C", "C", "C", "C"), Name = c("Jones", "Smith", "Johnson", 
 "Pastorius", "Jones", "Davis", "Coltrane", "Hancock", "Smith", 
 "Shorter", "Zawinul", "Pastorius", "Erskine")), 
  .Names =  c("Class", 
 "Name"), class = "data.frame", row.names = c(NA, -13L))

答案 1 :(得分:1)

Akrun,你钉了它!感谢SZenC的欢迎辞。是的,我意识到SO不是代码农场。我尝试了几种解决方案,但都是死路一条。当然,直到我发布了这个问题,然后找出了一个不优雅的解决方案:

class1 <- table(class0$Name, class0$Class)
class.m <- as.data.frame.matrix(class1)
class.mm <- as.matrix(class.m)
check.m <- t(class.mm) %*% class.mm
check.m

我似乎一步一步地做了十字产品。这也很有帮助。