2014-06-09 3 views
32

Ich habe einen Datenrahmen mit einer Anzahl von Spalten. Ich möchte eine neue Spalte namens "id" erstellen, die jeder Gruppe identischer Werte in der Spalte "sample" eine eindeutige ID-Nummer gibt.Wie man einer Gruppe identischer Werte in einer Spalte eine eindeutige ID-Nummer zuweist

Beispieldaten:

# 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 

Was mit Ich möchte am Ende:

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 

Antwort

47

Wie wäre es

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

?

Ich denke, das (cribbed von Creating a unique ID) sollte etwas effizienter sein, wenn auch vielleicht ein wenig schwieriger zu merken:

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

Love it: eine Verwendung für ' Faktoren, die ich verstehen kann. :-) –

+0

Nur eine kleine Anmerkung hier: die 'as.numeric (factor (sample))' Methode führt nur zu einer absteigenden Zahlenfolge, wenn 'sample' bereits geordnet ist. –

+0

Das Schöne an der 'factor()' -Lösung ist, dass sie 'NA'-Werte ignoriert –

32

Hier ist eine data.table Lösung

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