2013-03-20 30 views
9

Tôi sử dụng các yếu tố không thường xuyên và thường tìm thấy chúng dễ hiểu, nhưng tôi thường mờ về chi tiết cho các hoạt động cụ thể. Hiện tại, tôi đang mã hóa/thu hẹp các danh mục với vài quan sát thành "khác" và đang tìm kiếm một cách nhanh chóng để làm điều đó - tôi có 20 cấp độ của một biến, nhưng tôi muốn thu gọn một loạt các biến đó thành một biến.R: các mức hệ số, recode phần còn lại 'khác'

data<-data.frame(employees=sample.int(1000,500), 
     naics=sample(c('621111','621112','621210','621310','621320','621330','621340','621391','621399','621410','621420','621491','621492','621493','621498','621511','621512','621610','621910','621991','621999'),100,replace=T) 

)

Dưới đây là mức tôi quan tâm, và nhãn của họ trong vectơ riêng biệt.

#levels and labels 
top8 <-c('621111','621210','621399','621610','621330','621310','621511','621420','621320') 
top8_desc <- c('Offices of physicians', 
      'Offices of dentists', 
      'Offices of all other miscellaneous health practitioners', 
      'Home health care services', 
      'Offices of Mental Health Practitioners', 
      'Offices of chiropractors', 
      'Medical Laboratories', 
      'Outpatient Mental Health and Substance Abuse Centers', 
      'Offices of optometrists') 

Tôi có thể sử dụng cuộc gọi factor(), liệt kê tất cả, phân loại là "khác" cho mỗi lần một danh mục có vài quan sát.

Giả sử rằng 'top8' và 'top8_desc' ở trên là 8 thực tế hàng đầu, cách tốt nhất để khai báo dữ liệu $ naics dưới dạng biến yếu tố và mã hóa mọi thứ khác là 'khác' là gì?

Trả lời

6

Tôi nghĩ cách dễ nhất là gắn nhãn lại tất cả các số không nằm trong top 8 thành giá trị đặc biệt.

data$naics[!(data$naics %in% top8)] = -99 

Sau đó, bạn có thể sử dụng "loại trừ" tùy chọn khi biến nó thành một yếu tố

factor(data$naics, exclude=-99) 
+1

Hm, có liên quan đến dữ liệu thực sự ném đi như trái ngược với việc thay đổi phân loại , nhưng đó có lẽ là những gì mã hóa như là một yếu tố nào anyway ở nơi đầu tiên. Tôi cho rằng nó không quan trọng lắm. – ako

+1

Bạn luôn có thể tạo cột phụ trong khung dữ liệu với các mã đã được chuyển đổi. – kith

+1

Tôi đã thử biến thể này của câu trả lời của bạn: 'cấp độ (dữ liệu $ naics) [mà (! Cấp (dữ liệu $ naics)% trong% top8)] <-" khác "' – ako

0

Tôi đã viết được một chức năng để làm điều này mà có thể có ích cho những người khác có thể? Lần đầu tiên tôi kiểm tra theo cách tương đối, nếu mức xuất hiện ít hơn phần trăm mp của cơ sở. Sau đó tôi kiểm tra để giới hạn số lượng tối đa của các cấp là ml.

ds là tập dữ liệu trong tầm tay của loại dữ liệu.frame, tôi thực hiện việc này cho tất cả các cột xuất hiện trong cat_var_names làm các yếu tố.

cat_var_names <- names(clean_base[sapply(clean_base, is.factor)]) 

recodeLevels <- function (ds = clean_base, var_list = cat_var_names, mp = 0.01, ml = 25) { 
    # remove less frequent levels in factor 
    # 
    n <- nrow(ds) 
    # keep levels with more then mp percent of cases 
    for (i in var_list){ 
    keep <- levels(ds[[i]])[table(ds[[i]]) > mp * n] 
    levels(ds[[i]])[which(!levels(ds[[i]])%in%keep)] <- "other" 
    } 

    # keep top ml levels 
    for (i in var_list){ 
    keep <- names(sort(table(ds[i]),decreasing=TRUE)[1:ml]) 
    levels(ds[[i]])[which(!levels(ds[[i]])%in%keep)] <- "other" 
    } 
    return(ds) 
} 
+0

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, để lại nhận xét bên dưới bài viết của họ - bạn luôn có thể nhận xét về bài viết của riêng bạn, và một khi bạn có đủ [uy tín] (http://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bài đăng bất kỳ] (http://stackoverflow.com/help/privileges/comment). – Sliq

3

Một entry cuối

Đây là một wrapper cho plyr::mapvalues cho phép một cuộc tranh luận remaining (other của bạn)

library(plyr) 

Mapvalues <- function(x, from, to, warn_missing= TRUE, remaining = NULL){ 
    if(!is.null(remaining)){ 
    therest <- setdiff(x, from) 
    from <- c(from, therest) 
    to <- c(to, rep_len(remaining, length(therest))) 
    } 
    mapvalues(x, from, to, warn_missing) 
} 
# replace the remaining values with "other" 
Mapvalues(data$naics, top8, top8_desc,remaining = 'other') 
# leave the remaining values alone 
Mapvalues(data$naics, top8, top8_desc) 
Các vấn đề liên quan