2012-04-12 40 views
5

Tôi có một khung dữ liệu lớn có ba số nhận dạng. Ví dụ:cách chỉ định một số nhận dạng duy nhất cho nhiều mục nhập khung dữ liệu

df <- data.frame(year=c(1999,1999,2000,2000,2000), country=c('K','K','M','M','S'), 
       site=c('di','se','di','di','di')) 

Mà sẽ sản xuất một khung dữ liệu như thế này:

year country site 
    1999 K  di 
    1999 K  se 
    2000 M  di 
    2000 M  di 
    2000 S  di 

Tôi muốn thêm một cột bổ sung vào khung dữ liệu và có một 'id duy nhất' bằng cách sử dụng các mục cho giao 'năm', 'quốc gia' và 'trang web'. Nó sẽ trông giống như sau:

year country site unique_id 
    1999 K  di  1 
    1999 K  se  2 
    2000 M  di  3 
    2000 M  di  3 
    2000 S  di  4 

Bất kỳ đề xuất nào về cách thực hiện điều này sẽ được đánh giá cao. Tôi nghĩ nó có thể được thực hiện bằng cách sử dụng gói plyr?

Trả lời

7

Điều này sẽ hoạt động khá độc đáo. (Nó tận dụng lợi thế của thực tế là mức độ duy nhất của một yếu tố là mỗi thực sự được lưu trữ như số nguyên, và sử dụng as.numeric() để truy cập/trích xuất các giá trị số nguyên).

df$unique_id <- 
    as.numeric(as.factor(with(df, paste(year, country, site, sep="_")))) 
df 
# year country site unique_id 
# 1 1999  K di   1 
# 2 1999  K se   2 
# 3 2000  M di   3 
# 4 2000  M di   3 
# 5 2000  S di   4 
+0

cảm ơn, cả hai câu trả lời làm việc tốt. Nhiều đánh giá cao. – Austin

+5

có thể 'biến đổi (df, unique_id = as.integer (tương tác (năm, quốc gia, trang web, thả = TRUE)))' thay vì – baptiste

+1

@baptiste - Ngọt. Điều đó đẹp hơn nhiều và tôi rất vui khi biết về đối số 'drop = TRUE' đối với' interactive() '. –

1

tôi sẽ làm điều đó như thế này

lookup <- data.frame(id=1:length(unique(apply(df, 1, paste, collapse=""))), key=unique(apply(df, 1, paste, collapse=""))) 

df$id <- apply(df, 1, function(x) lookup[lookup$key==paste(x, collapse=""), "id"]) 
Các vấn đề liên quan