计算有序因子变量之间的差异

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

在我对 温布尔登数据 的持续探索中,我想弄清楚一名球员是否按照他们的种子排名所建议的那样完成了比赛。

因此,我想弄清楚他们达到的轮次与预期达到的轮次之间的差异。数据集中的“回合”是一个有序的因子变量。

这些是所有可能的值:

 rounds = c("Did not enter", "Round of 128", "Round of 64", "Round of 32", "Round of 16", "Quarter-Finals", "Semi-Finals", "Finals", "Winner")

如果我们想将几个字符串分解为这个因子,我们会这样做:

 round = factor("Finals", levels = rounds, ordered = TRUE) expected = factor("Winner", levels = rounds, ordered = TRUE) > round [1] Finals 9 Levels: Did not enter < Round of 128 < Round of 64 < Round of 32 < Round of 16 < Quarter-Finals < ... < Winner > expected [1] Winner 9 Levels: Did not enter < Round of 128 < Round of 64 < Round of 32 < Round of 16 < Quarter-Finals < ... < Winner

在这种情况下,实际轮次和预期轮次之间的差值应该是 -1——该球员本应赢得比赛,但在决赛中输了。我们可以通过 对每个变量调用 unclass 函数 来计算差异:

 > unclass(round) - unclass(expected) [1] -1 attr(,"levels") [1] "Did not enter" "Round of 128" "Round of 64" "Round of 32" "Round of 16" "Quarter-Finals" [7] "Semi-Finals" "Finals" "Winner"

这似乎仍然有 factor 变量的一些残余,所以为了摆脱它,我们可以将它转换为一个数值:

 > as.numeric(unclass(round) - unclass(expected)) [1] -1

就是这样!我们现在可以将此计算应用于所有种子,看看它们是如何发展的。