我有按班级学生注册的数据,我想计算一个矩阵,其中包含对角线上的总注册数和每个班级中双重注册的学生数。每行包括学生的姓名和他或她注册的课程。这里有一些假数据(有着名的爵士音乐家):
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中的计数,但是无法弄清楚如何使其可扩展以覆盖文件中的每个类。非常感谢您的意见和建议。
答案 0 :(得分:1)
我们可以将table
与crossprod
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
我似乎一步一步地做了十字产品。这也很有帮助。
乔