计算每个类中相同元素的数量

SA12

根据下表,我有许多不同的老师(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
Ben

这是一种基于R的基础解决方案,它基于一种通用方法来查找数据帧之间的公共行。也许这会有所帮助。

创建一个函数,该函数将在共享特定列(在本例中为classOpinion中具有其他公共值的教师之间的数据框中发现重叠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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章