2016-02-25 3 views
1

je vais créer un exemple simple de certaines données fictives:Attribution d'une variable d'identification unique à travers des valeurs répétées

case <- c('a','a','a','b','b','c','c','c','c','d','d','e','e') 
object <- c(1,1,2,1,1,1,1,2,3,1,1,1,2) 

df1 <- data.frame(case, object) 

Maintenant, pour chaque valeur case et object unique, je veux créer une valeur numérique unique correspondant (un identifiant)

df1$UNIQ_ID <- ........ 

Le résultat final devrait prendre les valeurs suivantes c(1,1,2,3,3,4,4,5,6,7,7,8,9) que lorsque

unique(df1$object[df1$case=='a']) 
unique(df1$object[df1$case=='b']) 

J'ai bien d'utiliser dpylr et group_by(case)

+0

Une autre approche de base de R serait la suivante: 'match (x <- interaction (DF1 $ case, DF1 objet $), unique (x)) ' –

Répondre

1

Nous pouvons utiliser la .GRP de data.table après regroupement par « cas » et « objet » sur un objet data.table (setDT(df1)).

library(data.table) 
setDT(df1)[,UNIQ_ID:= .GRP ,.(case, object)] 
df1 
#  case object UNIQ_ID 
# 1: a  1  1 
# 2: a  1  1 
# 3: a  2  2 
# 4: b  1  3 
# 5: b  1  3 
# 6: c  1  4 
# 7: c  1  4 
# 8: c  2  5 
# 9: c  3  6 
#10: d  1  7 
#11: d  1  7 
#12: e  1  8 
#13: e  2  9 

Une option base R serait

grp <- interaction(df1) 
as.numeric(factor(grp, levels= unique(grp))) 
#[1] 1 1 2 3 3 4 4 5 6 7 7 8 9 
+0

Très simple merci. Quand nous donnons alors 'str (df1)', nous voyons que la classe a changé "' Classes 'data.table' et 'data.frame' " – user08041991

+0

est-ce qu'un format' data.table' a un comportement différent d'un 'data.frame ' – user08041991

+1

@ user08041991 Si vous avez besoin de le changer en' data.frame', utilisez simplement 'setDF (df1)' – akrun