R dense_rank 无序

R dense_rank without ordering

我正在寻找类似 dense_rank 的东西,它会忽略排名列的顺序。

# some data
df <- data.frame(
  cat = c("A", "A", "B", "C", "A"),
  date = seq.Date(from = as.Date("2020-01-01"), length.out = 5, by = "days")
)
# showing the intended order
df$custom_order <- c(1,1,2,3,4)

预期的结果是这样的。第二个A被认为是第一个A的一部分。第五个A是"new" A,因为前面的猫不是A.

  cat       date custom_order
1   A 2020-01-01            1
2   A 2020-01-02            1
3   B 2020-01-03            2
4   C 2020-01-04            3
5   A 2020-01-05            4

有这样的功能吗?我知道它可以通过一些 lag() 魔法来实现,但我希望有更简单的方法。

只要当前元素与前一个元素不匹配,我们就可以使用 data.table 中的 rleid 来更新索引

library(data.table)
library(dplyr)  
df %>%
    mutate(custom_order = rleid(cat))
#    cat       date custom_order
#1   A 2020-01-01            1
#2   A 2020-01-02            1
#3   B 2020-01-03            2
#4   C 2020-01-04            3
#5   A 2020-01-05            4

base R中,这可以通过rle

实现
df$custom_order <-  with(rle(as.character(df$cat)), rep(seq_along(values), lengths))