首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算R中的值以并列下一个最高排名值

计算R中的值以并列下一个最高排名值
EN

Stack Overflow用户
提问于 2020-11-23 04:46:57
回答 2查看 39关注 0票数 2

考虑到下面的tibble,我想改变一个新的列,表明需要额外的计数才能并列第二高的排名。

代码语言:javascript
复制
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))。这是有效的,但当有关联时就不起作用了,因为第一个之后的任何关联的观察值都会与具有相同值的观察值进行比较。例如,在变异之后,我有这样的结果:

代码语言:javascript
复制
   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分才能追平第二名弗雷德。

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

EN

回答 2

Stack Overflow用户

发布于 2020-11-23 04:49:08

我们可以得到‘lag’的'distinct‘值的差值,然后执行right_join

代码语言:javascript
复制
library(dplyr)
v %>%
     distinct(count) %>% 
     mutate(ToTie = lag(count)- count) %>%
     right_join(v) %>%
     select(names(v), ToTie)

-output

代码语言:javascript
复制
# 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

代码语言:javascript
复制
library(tidyr)
v %>%
     mutate(toTie = lag(count) - count, 
            toTie = na_if(toTie, 0)) %>% 
     fill(toTie)
票数 1
EN

Stack Overflow用户

发布于 2020-11-23 05:13:59

您可以使用match()在第一次出现时为差异建立索引。

代码语言:javascript
复制
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    18
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64959369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档