Como atribuir um número de identificação exclusivo a cada grupo de valores idênticos em uma coluna

Eu tenho um quadro de dados com um número de colunas. Eu gostaria de criar uma nova coluna chamada “id” que fornece um número de identificação exclusivo para cada grupo de valores idênticos na coluna “sample”.

Exemplo de dados:

# 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 

O que eu gostaria de acabar com:

  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 

E se

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

?

Eu acho que isso (cribbed from Criando um ID único ) deve ser um pouco mais eficiente, embora talvez um pouco mais difícil de lembrar:

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

Aqui está uma solução data.table

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