R density_rank без заказа - PullRequest
       17

R density_rank без заказа

1 голос
/ 08 февраля 2020

Я ищу что-то вроде density_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 является «новым» 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 () c, но я надеялся, что может быть более простой способ.

1 Ответ

3 голосов
/ 08 февраля 2020

Мы можем использовать rleid из data.table для обновления индекса, когда текущий элемент не совпадает с предыдущим

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...