Создайте столбец на основе «скорректированной group_by» — R

#r #dplyr #group-by

Вопрос:

У меня есть фрейм данных с именами тренеров футбольных клубов. Иногда через некоторое время один и тот же тренер возвращается в команду после того, как его уволили в прошлом. Если я использую group_by, выходной df объединит оба тренера в одну группу. Однако я хочу, чтобы это создавало разные группы. Я не знаю, ясно ли я выразился, но я думаю, что этот пример даст лучшее объяснение, чем мой текст 😀

Если есть пакет или другая функция, которая могла бы это сделать, никаких проблем!

Заранее спасибо!

Пример

 library(dplyr)
df <- tibble(
  name = c("Jose","Jose", "Maria","Maria","Jose","Jose","Jose")
)
#Desired Output
adjusted_df <- tibble(
  name = c("Jose","Jose", "Maria","Maria","Jose","Jose","Jose"),
  number = c(1,1,1,1,2,2,2)
)
# I think after this desired output, I could group by name and number


 

Комментарии:

1. Что-то вроде df$number <- cumsum(df$name != lag(df$name) amp; duplicated(df$name)) 1 было бы близко к тому, что вы ищете? Или вы бы подумали о том, чтобы просто назначить изменение name с уникальным идентификатором, например, df$number <- rleid(df$name) с помощью data.table ? В последнем случае вы также можете group_by использовать оба name и number

2. Большое спасибо! Оба решения помогли бы! Второй, с data.table, довольно прост и полезен. В первом случае единственное ограничение заключается в том, что я хотел бы вернуть его на первое место, если в него будет включено новое имя после Хосе, например «Педро». Но я действительно ценю это, потому что во-вторых, это решит проблему, и это просто! Большое спасибо!!

Ответ №1:

Это даст вам уникальные идентификаторы, если вы группируетесь по имени и идентификатору. Это не точная последовательность, которую вы указали, но это сработает.

 library(dplyr)
df <- tibble(
  name = c("Jose","Jose", "Maria","Maria","Jose","Jose","Jose")) |> 
  mutate(id = cumsum(ifelse(name != lag(name) | is.na(lag(name)), 1, 0)))
 

Комментарии:

1. Большое спасибо!! Я действительно ценю это!! Это то, что мне нужно!