代码之家  ›  专栏  ›  技术社区  ›  bill999

如何打破排名差距的排名关系

  •  2
  • bill999  · 技术社区  · 4 年前

    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

    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
    

    2 回复  |  直到 4 年前
        1
  •  3
  •   akrun    4 年前

    我们可以补充一点 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
    

    或者可以简化为 rowid data.table

    library(data.table)
    data %>% 
         mutate(want = orig + rowid(orig)-1)
    
        2
  •  1
  •   ThomasIsCoding    4 年前

    使用 ave + seq_along

    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