根据下表,我有许多不同的老师(10,11,12,...),他们的想法各异(1,2,...例如1:非常好,2:2:好,...)类(1,2,3,...)。有些老师对某些班级一无所知。
class Teacher-code Opinion
1 12 1
1 13 1
1 14 1
2 11 3
2 13 1
3 10 1
3 11 2
3 12 1
3 13 1
这是我表的一个示例,但是我有很多记录。我希望有一个对称的教师矩阵,其中包含关于班级的相同想法。例如,老师12和13在1和3班级中的想法相同,则他们的交集元素为2。或者14和13的老师代码对第一节课只有一个相同的想法。我想得到以下矩阵:
[10] [11] [12] [13] [14]
[10] 0 0 1 1 0
[11] 0 0 0 0 0
[12] 1 0 0 2 1
[13] 1 0 2 0 1
[14] 0 0 1 1 0
这是一种基于R的基础解决方案,它基于一种通用方法来查找数据帧之间的公共行。也许这会有所帮助。
创建一个函数,该函数将在共享特定列(在本例中为class
和Opinion
)中具有其他公共值的教师之间的数据框中发现重叠。用merge
可以识别重叠行,并nrow
计算重叠行。
使用outer
您可以生成所有教师的矩阵。传递给产品的函数需要向量化。
the_teachers <- sort(unique(df$Teacher_code))
get_num_classes <- function(x, y) {
nrow(
merge(
df[df$Teacher_code == x, c("class", "Opinion")],
df[df$Teacher_code == y, c("class", "Opinion")]
)
)
}
mat <- outer(the_teachers, the_teachers, Vectorize(get_num_classes))
diag(mat) <- 0
dimnames(mat) <- list(the_teachers, the_teachers)
mat
输出量
10 11 12 13 14
10 0 0 1 1 0
11 0 0 0 0 0
12 1 0 0 2 1
13 1 0 2 0 1
14 0 0 1 1 0
编辑:基于评论,有兴趣确定(同一班上的教师对共享相同意见)/(同一班上的教师对共享)的比例。基于相同的逻辑,您可以如下修改功能。单独的合并将确定共享同一班级的教师人数。如果该数字不为零,它将确定教师对之间共享的意见数。如果没有共享的类,则该函数将仅返回零。根据数据的大小和老师之间的协调,可以进一步优化。
get_num_classes <- function(x, y) {
same_class <- nrow(
merge(
df[df$Teacher_code == x, "class", drop = F],
df[df$Teacher_code == y, "class", drop = F]
)
)
if (same_class != 0) {
same_opinion <- nrow(
merge(
df[df$Teacher_code == x, c("class", "Opinion")],
df[df$Teacher_code == y, c("class", "Opinion")]
)
)
return(same_opinion / same_class)
} else {
return(0)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句