#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. Большое спасибо!! Я действительно ценю это!! Это то, что мне нужно!