如何在R 中模擬SQL 的排名函數
對資料進行分區和排名是SQL 中的常見操作,R 使用者經常需要類似的功能。例如,Oracle ROW_NUMBER()、RANK() 和 DENSE_RANK() 函數會根據行在組內或整個表中的順序將整數值指派給行。
SQL Rank 的 R 等效項函數
data.table 套件提供了類似於 SQL 的分區和排序功能的功能。在 R 中,Rank 函數表示如下:
Rank:
rank(x, ties.method = "min")
Dense Rank:
as.integer(factor(x))
範例
至說明這些函數的用法,請考慮以下資料:library(data.table) DT <- data.table(ID = seq_len(4 * 3), group = rep(1:4, each = 3), value = rnorm(4 * 3), info = c(sample(c("a", "b"), 4 * 2, replace = TRUE), sample(c("c", "d"), 4, replace = TRUE)), key = "ID")
依群組內的值對每個 ID進行排名
DT[, valRank := rank(-value), by = "group"]
密集排名值組內信息
DT[, infoRank := rank(info, ties.method = "min"), by = "group"] DT[, infoRankDense := as.integer(factor(info)), by="group"]
正在模仿LEAD 和LAG
LEAD 和LAG 函數用於傳回群組中下一行或上一行的值。在 R 中,可以使用 J() 函數來實現:上一行:
DT[, prev := DT[J(group, idRank - 1), value, mult = 'last']]
下一行:
DT[, nex := DT[J(group, idRank + 1), value, mult = 'first']]
偏移行索引
要從更遠的行(例如前兩行或後兩行)檢索值,請相應地偏移idRank:前兩行:
DT[, prev2 := DT[J(group, idRank - 2), value, mult = 'last']]
接下來兩個行:
DT[, nex2 := DT[J(group, idRank + 2), value, mult = 'first']]
以上是如何在 R 複製 SQL 的 RANK、DENSE_RANK、LEAD 和 LAG 函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!