dplyr::row_number() 是否计算每个 obs 的行号?如果是这样,如何?

Does dplyr::row_number() calculate row number for each obs? If so, how?

tidyverse website参考资料中,我看到了两种用法mutate(mtcars, row_number() == 1L)mtcars %>% filter(between(row_number(), 1, 10))。可以直接认为 row_number() 函数是 return 数据框中每个观察值的行号。

但是在文档中已经强调,该函数是一个window函数,类似于其他语言的sortperm。如示例所示:

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

请问这个函数是为了报告每个观察的行号吗?如果是,函数调用背后的逻辑流程是什么?

谢谢!

?row_number所说,row_number等同于rank(ties.method = "first"),其中rank(参见?rank)returns样本排名向量中的值并使用 "first" 会导致在每个索引组的关系中增加值的排列:

row_number
# function (x) 
# rank(x, ties.method = "first", na.last = "keep")
# <bytecode: 0x108538478>
# <environment: namespace:dplyr>

所以,

x <- c(5, 1, 3, 2, 2, NA)
row_number(x)
# [1]  5  1  4  2  3 NA
rank(x, ties = "first", na.last = "keep") # I added na.last = "keep" to fully replicate row_number
# [1]  5  1  4  2  3 NA

sort(x)
# [1] 1 2 2 3 5

由于 ties = "first",我们给第一个 2 较低的排名。

现在,当我们在 filtermutate 调用中简单地使用 row_number() 时,确实它似乎只是 return 一个行号向量,可以发现here.