2014-06-09 9 views
32

में समान मानों के प्रत्येक समूह को एक अद्वितीय आईडी नंबर असाइन कैसे करें मेरे पास कई कॉलम के साथ डेटा फ्रेम है। मैं "आईडी" नामक एक नया कॉलम बनाना चाहता हूं जो "नमूना" कॉलम में समान मानों के प्रत्येक समूह को एक अद्वितीय आईडी संख्या देता है।कॉलम

उदाहरण डेटा:

# 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 

उत्तर

47

के बारे में कैसे

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

?

मुझे लगता है कि हालांकि शायद एक छोटे से कठिन याद करने के लिए यह (Creating a unique ID से cribbed), थोड़ा और अधिक कुशल होना चाहिए: `के लिए एक प्रयोग:

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

इसे प्यार है कारक 'जो मैं समझ सकता हूं। :-) –

+0

यहां बस एक छोटा सा नोट: 'as.numeric (कारक (नमूना)) 'विधि केवल तभी अवरोही संख्या अनुक्रम में होगी जब' नमूना' पहले ही आदेश दिया गया हो। –

+0

'कारक() 'समाधान के बारे में अच्छी बात यह है कि यह' NA' मानों को अनदेखा करता है –

32

यहाँ एक data.table समाधान

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