r - 计算 R 中的一个值以匹配下一个最高排名值
问题描述
鉴于以下 tibble,我想改变一个新列,指示与下一个最高排名并列所需的额外计数。
v <- tribble(
~rank, ~name, ~count,
1, "Mary", 100,
2, "Fred", 96,
3, "Sue", 90,
3, "Michelle", 90,
4, "Tom", 72
)
我试过dplyr
' 的滞后功能(v %>% mutate(toTie = lag(count) - count)
)。这是有效的,但在存在联系时不起作用,因为第一次之后的任何联系观察都会与具有相同值的观察进行比较。例如,在变异之后我有这个:
rank name count toTie
<dbl> <chr> <dbl> <dbl>
1 1 Mary 100 NA
2 2 Fred 96 4
3 3 Sue 90 6
4 3 Michelle 90 0
5 4 Tom 72 18
这个输出正确地说明了排名第三的 Sue 需要 6 才能追平第二名的 Fred。但是因为它将 Michelle 与 Sue(而不是 Fred)进行了比较,所以它说 Michelle 不需要任何东西来与 Sue 联系。这是真的,但不是意图。米歇尔和苏一样,需要 6 分才能追平第二名的弗雷德。
任何关于更好方法的想法将不胜感激。
解决方案
我们可以得到lag
'count'的'distinct'值的差异并做一个right_join
library(dplyr)
v %>%
distinct(count) %>%
mutate(ToTie = lag(count)- count) %>%
right_join(v) %>%
select(names(v), ToTie)
-输出
# A tibble: 5 x 4
# rank name count ToTie
# <dbl> <chr> <dbl> <dbl>
#1 1 Mary 100 NA
#2 2 Fred 96 4
#3 3 Sue 90 6
#4 3 Michelle 90 6
#5 4 Tom 72 18
或者另一种选择是fill
library(tidyr)
v %>%
mutate(toTie = lag(count) - count,
toTie = na_if(toTie, 0)) %>%
fill(toTie)
推荐阅读
- networking - MetalLB 将 IP 分配给 nginx,但目标主机无法访问
- javascript - 遍历 Javascript/JQuery 中的 Razor (SelectList) 参数
- swift - 对子视图的引用应该很弱吗?
- python - 带有守护线程的单例垃圾收集器
- python - K-mean 平均距离
- python - 如何使用 Sphinx 为 3 个项目生成一个复杂的文档网站
- node.js - 设置firebase实时数据库权限以从服务器使用
- machine-learning - 一类 SVM 算法耗时过长
- jupyter-notebook - 在 Mac 中启动 Juypter
- tensorflow - val_loss 不降低的 conv-autoencoder