如何在 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中文网其他相关文章!