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 так, чтобы она «знала», чтобы искать «данные» для переменных в других аргументах?
- определить параметр $ right с переменной в R
- Извлечь месяц и год из зоопарка :: объект yearmon
- Как преобразовать таблицу в кадр данных
- Как подсчитать количество уникальных значений по группе?
- Lapply для добавления столбцов в каждый Dataframe в списке
- если / else строит внутренние и внешние функции
- Как вы читаете в нескольких файлах .txt в R?
- data.frame без разрушения имен столбцов
- Найдите, сколько раз повторяющиеся строки повторяются в кадре данных R
Есть несколько способов.
В базе 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)