R создать идентификатор внутри группы

У меня есть следующий dataset:

df<-structure(list(IDFAM = c("2010 7599 2996 1", "2010 7599 3071 1", "2010 7599 3071 1", "2010 7599 3660 1", "2010 7599 4736 1", "2010 7599 6235 1", "2010 7599 6299 1", "2010 7599 9903 1", "2010 7599 11013 1", "2010 7599 11778 1", "2010 7599 11778 1", "2010 7599 12248 1", "2010 7599 13127 1", "2010 7599 14261 1", "2010 7599 16280 1", "2010 7599 16280 1", "2010 7599 16280 1", "2010 7599 16280 1", "2010 7599 16280 1", "2010 7599 17382 1"), AGED = c(45L, 47L, 24L, 46L, 46L, 44L, 43L, 43L, 43L, 16L, 43L, 46L, 44L, 47L, 43L, 16L, 20L, 18L, 18L, 43L)), .Names = c("IDFAM", "AGED"), row.names = c("5614", "5748", "5753", "6864", "8894", "11761", "11884", "18738", "20896", "22351", "22353", "23267", "24939", "27072", "30946", "30947", "30949", "30950", "30952", "33034"), class = "data.frame") 

Я хотел бы присвоить идентификатор каждому наблюдению, имеющему то же значение IDFAM диапазоне от 1 до n, где n – количество наблюдений с одинаковым значением IDFAM . Это приведет к следующей таблице:

 IDFAM AGED ID 2010 7599 2996 1 45 1 2010 7599 3071 1 47 1 2010 7599 3071 1 24 2 2010 7599 3660 1 46 1 2010 7599 4736 1 46 1 2010 7599 6235 1 44 1 2010 7599 6299 1 43 1 2010 7599 9903 1 43 1 2010 7599 11013 1 43 1 2010 7599 11778 1 16 1 2010 7599 11778 1 43 2 2010 7599 12248 1 46 1 2010 7599 13127 1 44 1 2010 7599 14261 1 47 1 2010 7599 16280 1 43 1 2010 7599 16280 1 16 2 2010 7599 16280 1 20 3 2010 7599 16280 1 18 4 2010 7599 16280 1 18 5 2010 7599 17382 1 43 1 

Как я могу это сделать ? Благодарю.

Есть несколько способов.

В базе R используйте ave :

 with(df, ave(rep(1, nrow(df)), IDFAM, FUN = seq_along)) # [1] 1 1 2 1 1 1 1 1 1 1 2 1 1 1 1 2 3 4 5 1 

С пакетом data.table используйте sequence(.N) :

 library(data.table) DT <- as.data.table(df) DT[, ID := sequence(.N), by = IDFAM] 

С пакетом «dplyr» попробуйте:

 df %>% group_by(IDFAM) %>% mutate(count = sequence(n())) 

или (как рекомендовано Хэдли в комментариях):

 df %>% group_by(IDFAM) %>% mutate(count = row_number(IDFAM)) 

Обновить

Поскольку это похоже на то, что требуется относительно часто, эта функция была добавлена ​​как функция ( getanID ) в моем пакете «splitstackshape». Он основан на подходе «data.table» выше.

 library(splitstackshape) getanID(df, id.vars = "IDFAM") # IDFAM AGED .id # 1: 2010 7599 2996 1 45 1 # 2: 2010 7599 3071 1 47 1 # 3: 2010 7599 3071 1 24 2 # 4: 2010 7599 3660 1 46 1 # 5: 2010 7599 4736 1 46 1 # 6: 2010 7599 6235 1 44 1 # 7: 2010 7599 6299 1 43 1 # 8: 2010 7599 9903 1 43 1 # 9: 2010 7599 11013 1 43 1 # 10: 2010 7599 11778 1 16 1 # 11: 2010 7599 11778 1 43 2 # 12: 2010 7599 12248 1 46 1 # 13: 2010 7599 13127 1 44 1 # 14: 2010 7599 14261 1 47 1 # 15: 2010 7599 16280 1 43 1 # 16: 2010 7599 16280 1 16 2 # 17: 2010 7599 16280 1 20 3 # 18: 2010 7599 16280 1 18 4 # 19: 2010 7599 16280 1 18 5 # 20: 2010 7599 17382 1 43 1 

С помощью dplyr 0.5 вы можете использовать функцию group_indices . Хотя он не поддерживает mutate , следующий подход прост:

 df$id <- df %>% group_indices(IDFAM) 
  • Разверните строки по дате с использованием даты начала и окончания
  • Удалите повторяющиеся пары столбцов, сортируйте строки на основе двух столбцов
  • Стандартный способ удаления нескольких элементов из фрейма данных
  • вытащить p-значения и r-квадрат из линейной регрессии
  • Как вычесть месяцы из даты в R?
  • Лучший способ конвертировать список в вектор?
  • как найти верхние значения N по группам или внутри категории (по группам) в R.frame
  • Удалите строки в R-матрице, где все данные NA
  • Форматирование больших валютных или долларовых значений в миллионы / миллиарды
  • Автоматическое расширение R-фактора в набор переменных индикатора 1/0 для каждого уровня фактора
  • Подавить вывод одной команды в R
  • Давайте будем гением компьютера.