【问题标题】:How to break ties in a ranking with gaps in ranking [duplicate]如何打破排名差距与排名差距[重复]
【发布时间】:2021-08-16 21:47:00
【问题描述】:

假设我有这些数据:

data <- data.frame(orig=c(1,5,5,5,14,18,18,25))

  orig
1    1
2    5
3    5
4    5
5   14
6   18
7   18
8   25

我想创建want 列:

  orig want
1    1    1
2    5    5
3    5    6
4    5    7
5   14   14
6   18   18
7   18   19
8   25   25

此列采用orig 并复制其值,但如果存在关系,则会中断。我想要做的是重新创建排名,以便没有平局,并且根据数据集中行的顺序打破平局。如果不是排名中的空格(从 1 跳到 5 等),我可以使用

library(tidyverse)
data %>% mutate(test = rank(orig, ties.method="min"))

但这当然不能得到我想要的:

  orig test
1    1    1
2    5    2
3    5    2
4    5    2
5   14    5
6   18    6
7   18    6
8   25    8

我能做什么?

【问题讨论】:

标签: r dataframe dplyr tidyverse


【解决方案1】:

我们可以在分组后添加row_number()

library(dplyr)
data %>%
     group_by(orig) %>% 
     mutate(want = orig + row_number() - 1) %>%
     ungroup

-输出

# A tibble: 8 x 2
   orig  want
  <dbl> <dbl>
1     1     1
2     5     5
3     5     6
4     5     7
5    14    14
6    18    18
7    18    19
8    25    25

或者可以从data.table 使用rowid 进行简化

library(data.table)
data %>% 
     mutate(want = orig + rowid(orig)-1)

【讨论】:

    【解决方案2】:

    使用ave + seq_along 的基本 R 选项

    transform(
      data,
      want = orig + ave(orig, orig, FUN = seq_along) - 1
    )
    

    给予

      orig want
    1    1    1
    2    5    5
    3    5    6
    4    5    7
    5   14   14
    6   18   18
    7   18   19
    8   25   25
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2016-04-04
      • 2014-07-12
      • 1970-01-01
      • 2023-01-01
      • 2013-03-20
      • 1970-01-01
      相关资源
      最近更新 更多