dplyr :: row_number()是否为每个obs计算行号?如果是这样,怎么办?

时间:2019-01-03 00:05:51

标签: r dplyr row-number

tidyverse website参考中,我看到了两种用法mutate(mtcars, row_number() == 1L)mtcars %>% filter(between(row_number(), 1, 10))。直接想到row_number()函数将返回数据帧中每个观察值的行号。

但是,文档中已经强调该函数是窗口函数,并且在其他语言中类似于sortperm。如示例所示:

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

请问该功能是否旨在报告每次观察的行号?如果是,那么函数调用背后的逻辑流程是什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

正如?row_number所说,row_number等效于rank(ties.method = "first"),其中rank(请参阅?rank)返回向量中值的样本等级,并且使用"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

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

现在,当我们在row_number()filter调用中仅使用mutate时,实际上似乎只是返回了行号向量,如here所示。