當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R dplyr row_number 整數排名函數


受 SQL2003 啟發的三個排名函數。它們的主要區別在於處理關係的方式:

  • row_number() 為每個輸入提供唯一的排名,以便 c(10, 20, 20, 30) 獲得排名 c(1, 2, 3, 4) 。它相當於rank(ties.method = "first")

  • min_rank() 為每個平局賦予相同(最小)的值,以便 c(10, 20, 20, 30) 獲得排名 c(1, 2, 2, 4) 。這是體育運動中通常計算排名的方式,相當於 rank(ties.method = "min")

  • dense_rank() 的工作方式與 min_rank() 類似,但不會留下任何間隙,因此 c(10, 20, 20, 30) 的排名為 c(1, 2, 2, 3)

用法

row_number(x)

min_rank(x)

dense_rank(x)

參數

x

用於排名的向量

默認情況下,最小值將獲得最小的排名。使用 desc() 反轉方向,使最大值獲得最小的排名。

缺失值將被賦予排名 NA 。如果您想分別將它們視為最大值或最小值,請使用coalesce(x, Inf)coalesce(x, -Inf)

要一次按多列排名,請提供 DataFrame 。

整數向量。

也可以看看

其他排名函數:ntile()percent_rank()

例子

x <- c(5, 1, 3, 2, 2, NA)
row_number(x)
#> [1]  5  1  4  2  3 NA
min_rank(x)
#> [1]  5  1  4  2  2 NA
dense_rank(x)
#> [1]  4  1  3  2  2 NA

# Ranking functions can be used in `filter()` to select top/bottom rows
df <- data.frame(
  grp = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
  x = c(3, 2, 1, 1, 2, 2, 1, 1, 1),
  y = c(1, 3, 2, 3, 2, 2, 4, 1, 2),
  id = 1:9
)
# Always gives exactly 1 row per group
df %>% group_by(grp) %>% filter(row_number(x) == 1)
#> # A tibble: 3 × 4
#> # Groups:   grp [3]
#>     grp     x     y    id
#>   <dbl> <dbl> <dbl> <int>
#> 1     1     1     2     3
#> 2     2     1     3     4
#> 3     3     1     4     7
# May give more than 1 row if ties
df %>% group_by(grp) %>% filter(min_rank(x) == 1)
#> # A tibble: 5 × 4
#> # Groups:   grp [3]
#>     grp     x     y    id
#>   <dbl> <dbl> <dbl> <int>
#> 1     1     1     2     3
#> 2     2     1     3     4
#> 3     3     1     4     7
#> 4     3     1     1     8
#> 5     3     1     2     9
# Rank by multiple columns (to break ties) by selecting them with `pick()`
df %>% group_by(grp) %>% filter(min_rank(pick(x, y)) == 1)
#> # A tibble: 3 × 4
#> # Groups:   grp [3]
#>     grp     x     y    id
#>   <dbl> <dbl> <dbl> <int>
#> 1     1     1     2     3
#> 2     2     1     3     4
#> 3     3     1     1     8
# See slice_min() and slice_max() for another way to tackle the same problem

# You can use row_number() without an argument to refer to the "current"
# row number.
df %>% group_by(grp) %>% filter(row_number() == 1)
#> # A tibble: 3 × 4
#> # Groups:   grp [3]
#>     grp     x     y    id
#>   <dbl> <dbl> <dbl> <int>
#> 1     1     3     1     1
#> 2     2     1     3     4
#> 3     3     1     4     7

# It's easiest to see what this does with mutate():
df %>% group_by(grp) %>% mutate(grp_id = row_number())
#> # A tibble: 9 × 5
#> # Groups:   grp [3]
#>     grp     x     y    id grp_id
#>   <dbl> <dbl> <dbl> <int>  <int>
#> 1     1     3     1     1      1
#> 2     1     2     3     2      2
#> 3     1     1     2     3      3
#> 4     2     1     3     4      1
#> 5     2     2     2     5      2
#> 6     2     2     2     6      3
#> 7     3     1     4     7      1
#> 8     3     1     1     8      2
#> 9     3     1     2     9      3
源代碼:R/rank.R

相關用法


注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Integer ranking functions。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。