如何解决两列之间的滚动比较每行
我正在尝试编写一个代码来提取老师的 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 columns 和 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_sum
和final_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_rows
和data.table::rbindlist
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。