2014-06-09 24 views
32

Tôi có một khung dữ liệu với một số cột. Tôi muốn tạo một cột mới có tên là "id" cung cấp số id duy nhất cho mỗi nhóm các giá trị giống hệt nhau trong cột "mẫu".Cách chỉ định một số ID duy nhất cho mỗi nhóm giá trị giống hệt nhau trong một cột

dữ liệu Ví dụ:

# 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 

Những gì tôi muốn kết thúc với:

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 

Trả lời

47

Làm thế nào về

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

?

Tôi nghĩ rằng đây (cribbed từ Creating a unique ID) nên hơi hiệu quả hơn, mặc dù có lẽ một chút khó khăn hơn để nhớ:

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

Tình yêu nó: một sử dụng cho ' các yếu tố mà tôi có thể hiểu được. :-) –

+0

Chỉ cần một lưu ý nhỏ ở đây: phương thức 'as.numeric (factor (sample))' sẽ chỉ dẫn đến một chuỗi số giảm dần nếu 'sample' đã được đặt hàng. –

+0

điều tốt đẹp về giải pháp 'factor()' là nó bỏ qua các giá trị 'NA' –

32

Dưới đây là một giải pháp data.table

library(data.table) 
setDT(df)[, id := .GRP, by = sample] 
Các vấn đề liên quan