考虑到下面的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平起平坐。但因为它将米歇尔比作苏(而不是弗雷德),所以它说米歇尔不需要任何人来捆绑苏。这是真的,但不是本意。米歇尔和苏一样,需要6分才能追平第二名弗雷德。
任何关于更好方法的想法都将不胜感激。
发布于 2020-11-23 04:49:08
我们可以得到‘lag’的'distinct‘值的差值,然后执行right_join
library(dplyr)
v %>%
distinct(count) %>%
mutate(ToTie = lag(count)- count) %>%
right_join(v) %>%
select(names(v), ToTie)-output
# 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)发布于 2020-11-23 05:13:59
您可以使用match()在第一次出现时为差异建立索引。
library(dplyr)
v %>%
mutate(toTie = c(NA, diff(-count))[match(count, count)])
# 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 18https://stackoverflow.com/questions/64959369
复制相似问题