web-dev-qa-db-fra.com

Comment attribuer un numéro d'identification unique à chaque groupe de valeurs identiques dans une colonne

J'ai un bloc de données avec un certain nombre de colonnes. Je voudrais créer une nouvelle colonne appelée "id" qui donne un numéro d'identification unique à chaque groupe de valeurs identiques dans la colonne "échantillon".

Exemples de données:

# 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  

Ce que j'aimerais finir avec:

  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
37
jjulip

Que diriez-vous

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

?

Je pense que cela (extrait de Création d'un identifiant unique ) devrait être légèrement plus efficace, bien que peut-être un peu plus difficile à retenir:

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

Voici un data.table Solution

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