首页 > 解决方案 > 计算 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 分才能追平第二名的弗雷德。

任何关于更好方法的想法将不胜感激。

标签: rdplyr

解决方案


我们可以得到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)

推荐阅读