2010-03-24 33 views
10

Tôi có một véc tơ X chứa số dương mà tôi muốn bin/discretize. Đối với vectơ này, tôi muốn các số [0, 10) hiển thị giống như chúng tồn tại trong vectơ, nhưng số [10, ∞) phải là 10+.Binning một biến số trong R

Tôi đang sử dụng:

x <- c(0,1,3,4,2,4,2,5,43,432,34,2,34,2,342,3,4,2) 
binned.x <- as.factor(ifelse(x > 10,"10+",x)) 

nhưng điều này cảm thấy klugey với tôi. Có ai biết một giải pháp tốt hơn hoặc một cách tiếp cận khác nhau?

+1

Kludgy là gì? Nó trông khá gọn gàng với tôi. –

+2

@Rob: Hạn chế chính của phương pháp này là bạn không nhận được các mức yếu tố được tạo cho các giá trị không có ở đó (ví dụ: đối với dữ liệu này không có cấp "6"). Điều này có thể được sửa với mức độ rõ ràng trong lệnh gọi đến 'factor'. –

Trả lời

17

Làm thế nào về cut:

binned.x=cut(x, breaks=c(-1:9,Inf), labels=c(as.character(0:9),'10+')) 

nào mang lại:

[1] 0 1 3 4 2 4 2 5 10+ 10+ 10+ 2 10+ 2 10+ 3 4 2 
Levels: 0 1 2 3 4 5 6 7 8 9 10+ 
+1

Điều đó có vẻ phức tạp hơn giải pháp trong câu hỏi. –

+1

Cải tiến nhỏ: Hoán đổi '1e6' bằng' Inf'. Bạn không cần 'include.lowest = TRUE'. (So ​​sánh câu trả lời bằng cách gọi 'bảng (binned.x)'. –

+0

@Rob: Có, tôi không thể nói rằng tôi không đồng ý :) @Richie: Cảm ơn! Tôi vẫn đang học ngôn ngữ, vì vậy "những cải tiến nhỏ" của bạn là một trợ giúp lớn đối với tôi. – unutbu

7

Bạn câu hỏi là không phù hợp.
Trong mô tả 10 thuộc về nhóm "10+", nhưng trong mã 10 là cấp độ riêng biệt. Nếu 10nên được trong "10+" nhóm sau đó bạn mã nên được

as.factor(ifelse(x >= 10,"10+",x)) 

Trong trường hợp này bạn có thể cắt xén dữ liệu đến 10 (nếu bạn không muốn có một yếu tố):

pmin(x, 10) 
# [1] 0 1 3 4 2 4 2 5 10 10 10 2 10 2 10 3 4 2 10 
2
x[x>=10]<-"10+" 

Điều này sẽ cung cấp cho bạn chuỗi vectơ. Bạn có thể sử dụng as.numeric(x) để chuyển đổi về số ("10+" trở thành NA) hoặc as.factor(x) để nhận kết quả ở trên.

Lưu ý rằng điều này sẽ sửa đổi bản gốc vectơ gốc, vì vậy bạn có thể muốn sao chép sang một vectơ khác và thực hiện công việc đó.

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