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

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

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

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

这些是所有可能的值:

 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

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

相关文章