微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

两列之间的滚动比较每行

如何解决两列之间的滚动比较每行

我正在尝试编写一个代码提取老师的 ID,该老师为学生分配了相同的期中分数,但在他们的期末考试中给出了不同的分数。

虽然我有兴趣确定对于 不同 final_scores 的 mid_term 分数相同的情况,但我对相反的关系不感兴趣,即它不如果为不同的期中分数给出相同的 final_scores 对我来说很重要。

输入:

我的输入 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的值在同一老师(SUID)的不同学生(TUserId)中相同时,将不一致放在额外的列中。我主要是想提取出现这种差异的老师ID。

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

Rolling computation to identify mismatch between two columnsFinding 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_sum 值出现不止一次,这意味着我们这里有问题;
  • any(..) 将为这位老师返回一个 TRUE(因为我们正在分组……请参阅下面的 by)如果任何行显示不一致,我们不会关心哪一个;
  • data.frame(..) 只是为了方便后面的组合,对于预期的输出肯定有不同的处理方式;
  • by(dat,..) 将每个教师的数据分组,并作为其 z 参数传递给匿名函数;第一次调用这个函数时,它看到的所有 z 都是 dat[1:2,] (id 115);第二次调用这个匿名函数时,它看到的所有 z 都是 dat[3:5,] (id 209);等;
  • do.call(rbind,..)by的返回值是一个list,由于上面的data.frame(.),所以它是一个框架列表;将此帧列表合并为单个帧的最佳和最快方法就是使用此技巧。在基础 R 之外还有其他类似和/或更好的方法(例如,dplyr::bind_rowsdata.table::rbindlist)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。