两列之间的滚动比较(每行)
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_sum
和 final_sum
;他们应该相同或不同的前提是这里的关键;
table(unique(..)$mid_sum)
统计不同值的个数;因为我们已经减少了所有 mid/final 对,如果我们看到一个 mid_sum
值出现不止一次,这意味着我们这里有问题;
如果任何行显示不一致,我们不关心是哪一个;
data.frame(..)
只是为了方便后面的组合,当然有不同的方式来处理预期的输出;
by(dat, dat$TUserId, ..)
将每个老师的数据分组,并作为其z
参数传递给匿名函数;第一次调用此函数时,它所看到的 z
是 dat[1:2,]
(id 115);第二次调用此 anon-func 时,它所看到的 z
是 dat[3:5,]
(id 209);等等;
do.call(rbind, ..)
:by
的return值是一个list
,因为上面的data.frame(.)
,它是一个帧列表;将此帧列表组合成单个帧的最好和最快的方法是执行此技巧。在基础 R 之外还有其他类似的 and/or 更好的方法(例如,dplyr::bind_rows
和 data.table::rbindlist
)。
我正在尝试编写一个代码来提取给学生分配 相同 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。
这与以下两个帖子有关,但其中一个解决方案符合我的要求。
如有任何帮助,我们将不胜感激。
第三次尝试:-)
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/final 对,如果我们看到一个mid_sum
值出现不止一次,这意味着我们这里有问题;
如果任何行显示不一致,我们不关心是哪一个;
data.frame(..)
只是为了方便后面的组合,当然有不同的方式来处理预期的输出;by(dat, dat$TUserId, ..)
将每个老师的数据分组,并作为其z
参数传递给匿名函数;第一次调用此函数时,它所看到的z
是dat[1:2,]
(id 115);第二次调用此 anon-func 时,它所看到的z
是dat[3:5,]
(id 209);等等;do.call(rbind, ..)
:by
的return值是一个list
,因为上面的data.frame(.)
,它是一个帧列表;将此帧列表组合成单个帧的最好和最快的方法是执行此技巧。在基础 R 之外还有其他类似的 and/or 更好的方法(例如,dplyr::bind_rows
和data.table::rbindlist
)。