受 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)
。
參數
- 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 dplyr rowwise 按行對輸入進行分組
- R dplyr rows 操作單獨的行
- R dplyr recode 重新編碼值
- R dplyr rename 重命名列
- R dplyr relocate 更改列順序
- R dplyr reframe 將每個組轉換為任意數量的行
- R dplyr group_trim 修剪分組結構
- R dplyr slice 使用行的位置對行進行子集化
- R dplyr copy_to 將本地數據幀複製到遠程src
- R dplyr sample_n 從表中采樣 n 行
- R dplyr consecutive_id 為連續組合生成唯一標識符
- R dplyr band_members 樂隊成員
- R dplyr mutate-joins 變異連接
- R dplyr nth 從向量中提取第一個、最後一個或第 n 個值
- R dplyr coalesce 找到第一個非缺失元素
- R dplyr group_split 按組分割 DataFrame
- R dplyr mutate 創建、修改和刪除列
- R dplyr order_by 用於排序窗口函數輸出的輔助函數
- R dplyr context 有關“當前”組或變量的信息
- R dplyr percent_rank 比例排名函數
- R dplyr starwars 星球大戰人物
- R dplyr desc 降序
- R dplyr between 檢測值落在指定範圍內的位置
- R dplyr cumall 任何、全部和平均值的累積版本
- R dplyr group_map 對每個組應用一個函數
注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Integer ranking functions。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。