2012-11-26 21 views
13

Tôi có khung dữ liệu với biến số liên tục, tuổi tính theo tháng (age_mnths). Tôi muốn tạo một biến riêng biệt mới, với các loại tuổi dựa trên khoảng thời gian tuổi.Chuyển đổi các giá trị số liên tục thành các danh mục rời rạc được xác định theo khoảng thời gian

# Some example data 
rota2 <- data.frame(age_mnth = 1:170) 

Tôi đã tạo thủ tục dựa trên ifelse (bên dưới), nhưng tôi tin rằng có khả năng giải pháp thanh lịch hơn.

rota2$age_gr<-ifelse(rota2$age_mnth < 6, rr2 <- "0-5 mnths", 

    ifelse(rota2$age_mnth > 5 & rota2$age_mnth < 12, rr2 <- "6-11 mnths", 

      ifelse(rota2$age_mnth > 11 & rota2$age_mnth < 24, rr2 <- "12-23 mnths", 

       ifelse(rota2$age_mnth > 23 & rota2$age_mnth < 60, rr2 <- "24-59 mnths", 

         ifelse(rota2$age_mnth > 59 & rota2$age_mnth < 167, rr2 <- "5-14 yrs", 

           rr2 <- "adult"))))) 

Tôi biết có chức năng cut nhưng tôi không thể giải quyết nó vì mục đích của mình để phân loại/phân loại.

+0

Một lỗi cơ bản ở đây là việc sử dụng các toán tử gán trong các giá trị cho "có" và "không" thông số –

Trả lời

30

Nếu có lý do bạn không muốn sử dụng cut thì tôi không hiểu tại sao. cut sẽ làm việc tốt cho những gì bạn muốn làm

# Some example data 
rota2 <- data.frame(age_mnth = 1:170) 
# Your way of doing things to compare against 
rota2$age_gr<-ifelse(rota2$age_mnth<6,rr2<-"0-5 mnths", 
        ifelse(rota2$age_mnth>5&rota2$age_mnth<12,rr2<-"6-11 mnths", 
          ifelse(rota2$age_mnth>11&rota2$age_mnth<24,rr2<-"12-23 mnths", 
            ifelse(rota2$age_mnth>23&rota2$age_mnth<60,rr2<-"24-59 mnths", 
              ifelse(rota2$age_mnth>59&rota2$age_mnth<167,rr2<-"5-14 yrs", 
               rr2<-"adult"))))) 

# Using cut 
rota2$age_grcut <- cut(rota2$age_mnth, 
         breaks = c(-Inf, 6, 12, 24, 60, 167, Inf), 
         labels = c("0-5 mnths", "6-11 mnths", "12-23 mnths", "24-59 mnths", "5-14 yrs", "adult"), 
         right = FALSE) 
10
rota2$age_gr<-c("0-5 mnths", "6-11 mnths", "12-23 mnths", "24-59 mnths", "5-14 yrs", 
       "adult")[ 
      findInterval(rota2$age_mnth , c(-Inf, 5.5, 11.5, 23.5, 59.5, 166.5, Inf)) ] 
+1

Nó là hơi khác hơn ' cut' trong đó các khoảng được đóng ở bên trái và mở ở bên phải trừ khi có quy định khác. –

+1

Nhưng bạn luôn có thể viết phiên bản findInterval được đóng ở bên phải và mở ở bên trái - http://stackoverflow.com/questions/13482872/findinterval-with-right-closed-intervals – Dason

Các vấn đề liên quan