两列之间的滚动比较(每行)

Rolling comparison (per row) between two columns

我正在尝试编写一个代码来提取给学生分配 相同 mid_term 分数但随后给 分数的老师的 ID他们的决赛得分不同

虽然我有兴趣确定 mid_term 分数与 相同不同 final_scores 的情况],我对相反的关系不感兴趣,即,如果相同的 final_scores 被赋予不同的 mid_term 分数对我来说并不重要。

输入:

我的输入 df 看起来像这样::

TUserId  SUID   mid_sum final_sum
 115      201   7       1
 115      309   7       2
 209      245   10      2
 209      398   10      2
 209      510   10      3
 302      423   8       1
 302      456   8       1
 412      189   6       1
 412      191   7       1
输出:

在输出中,我只是在寻找一种方法,使教师 ID 具有以下标志

TUserId  Flag
 115     inconsistent
 209     inconsistent
 302     consistent
 412     consistent

TUserId  Flag
 115     TRUE
 209     TRUE
 302     FALSE
 412     FALSE

要求:

当mid_sum的值在同一老师(TUserId所示)的不同学生(SUID所示)之间相同时,它会在附加列中显示不一致.我主要是想提取出现这种差异的教师ID。

这与以下两个帖子有关,但其中一个解决方案符合我的要求。

and Finding if a value is within the range of other columns

如有任何帮助,我们将不胜感激。

第三次尝试:-)

do.call(rbind, by(dat, dat$TUserId, FUN = function(z) {
  data.frame(
    TUserId = z$TUserId[1],
    Flag = any(table(unique(subset(z, select=c("mid_sum","final_sum")))$mid_sum) > 1)
  )
}))
#     TUserId  Flag
# 115     115  TRUE
# 209     209  TRUE
# 302     302 FALSE
# 412     412 FALSE

遍历,由内而外:

  • unique(subset(..)) 减少了 唯一 组合的数量 mid_sumfinal_sum;他们应该相同或不同的前提是这里的关键;
  • table(unique(..)$mid_sum)统计不同值的个数;因为我们已经减少了所有 mid/final 对,如果我们看到一个 mid_sum 值出现不止一次,这意味着我们这里有问题;
  • 如果任何行显示不一致,我们不关心是哪一个;
  • data.frame(..)只是为了方便后面的组合,当然有不同的方式来处理预期的输出;
  • by(dat, dat$TUserId, ..) 将每个老师的数据分组,并作为其z参数传递给匿名函数;第一次调用此函数时,它所看到的 zdat[1:2,] (id 115);第二次调用此 anon-func 时,它所看到的 zdat[3:5,] (id 209);等等;
  • do.call(rbind, ..)by的return值是一个list,因为上面的data.frame(.),它是一个帧列表;将此帧列表组合成单个帧的最好和最快的方法是执行此技巧。在基础 R 之外还有其他类似的 and/or 更好的方法(例如,dplyr::bind_rowsdata.table::rbindlist)。