Подтвердить что ты не робот

Как назначить уникальный идентификационный номер каждой группе одинаковых значений в столбце

У меня есть кадр данных с несколькими столбцами. Я хотел бы создать новый столбец с именем "id", который дает уникальный идентификационный номер каждой группе одинаковых значений в столбце "sample".

Пример данных:

# dput(df)
df <- structure(list(index = 1:30, val = c(14L, 22L, 1L, 25L, 3L, 34L, 
35L, 36L, 24L, 35L, 33L, 31L, 30L, 30L, 29L, 28L, 26L, 12L, 41L, 
36L, 32L, 37L, 56L, 34L, 23L, 24L, 28L, 22L, 10L, 19L), sample = c(5L, 
6L, 6L, 7L, 7L, 7L, 8L, 9L, 10L, 11L, 11L, 12L, 13L, 14L, 14L, 
15L, 15L, 15L, 16L, 17L, 18L, 18L, 19L, 19L, 19L, 20L, 21L, 22L, 
23L, 23L)), .Names = c("index", "val", "sample"), class = "data.frame", 
row.names = c(NA, -30L))

head(df)
  index val sample 
1     1  14      5  
2     2  22      6  
3     3   1      6  
4     4  25      7  
5     5   3      7  
6     6  34      7  

Что бы я хотел:

  index val sample id
1     1  14      5  1
2     2  22      6  2
3     3   1      6  2
4     4  25      7  3
5     5   3      7  3
6     6  34      7  3

У меня возникли проблемы с этим, так как любые советы будут высоко оценены.

Спасибо!

4b9b3361

Ответ 1

Как насчет

df2 <- transform(df,id=as.numeric(factor(sample)))

?

Я думаю, что это (cribbed from Создание уникального идентификатора) должно быть немного более эффективным, хотя, возможно, немного сложнее запомнить:

df3 <- transform(df, id=match(sample, unique(sample)))
all.equal(df2,df3)  ## TRUE

Ответ 2

Здесь a data.table solution

library(data.table)
setDT(df)[, id := .GRP, by = sample]