2013-06-20 16 views
28

Với dữ liệu giả sau đây:Làm thế nào tôi có thể thả các mức không sử dụng từ một khung dữ liệu?

set.seed(123) 
x <- data.frame(let = sample(letters[1:5], 100, replace = T), 
       num = sample(1:10, 100, replace = T)) 
y <- subset(x, let != 'a') 

Tạo một bảng y$let mang

a b c d e 
0 20 21 22 18 

Nhưng tôi không muốn a để hiển thị nữa. Nếu tôi cố gắng để làm điều này:

levels(y$let) <- factor(y$let) 

tôi mớ hỗn độn các tần số, kể từ bây giờ table(y$let) mang lại cho tôi

b d c e 
0 20 21 40 

Tôi biết tôi có thể làm xtabs(~ y$let, drop.unused.levels = T) và làm việc xung quanh vấn đề này, nhưng nó không thiết lập lại các mức biến ở lõi của nó (điều quan trọng đối với tôi, vì đây là một thay đổi ban đầu mà tôi đang thực hiện cho tập dữ liệu sẽ thực hiện trong toàn bộ phân tích). Hơn nữa, xtabs là một lớp học khác nhau từ table, điều này sẽ khiến tôi đau đầu sau này trong dự án.

Câu hỏi đặt ra là: làm cách nào tôi có thể tự động thay đổi levels(y$let) để nó không hiển thị các cấp đã bị xóa khi tôi tạo tập hợp con? Trong trường hợp này, làm thế nào tôi có thể làm cho nó hiển thị [1] "b" "c" "d" "e"?

+3

Câu trả lời giành được trong câu hỏi trùng lặp của anh ấy không tốt bằng câu trả lời ở đây. Các khác nên được đánh dấu là một bản sao của điều này vì đây là một câu trả lời tốt hơn MUCH – TheSteve0

Trả lời

103

Có một chức năng được thêm gần đây trong R cho việc này:

y <- droplevels(y) 
17

Chỉ cần y$let <- factor(y$let). Chạy factor trên biến yếu tố hiện tại sẽ đặt lại các mức thành chỉ những cấp có mặt.

1

Thêm vào câu trả lời của Hồng Ooi, here is một ví dụ tôi tìm thấy từ R-blogger.

# Create some fake data 
x <- as.factor(sample(head(colors()),100,replace=TRUE)) 
levels(x) 
x <- x[x!="aliceblue"] 
levels(x) # still the same levels 
table(x) # even though one level has 0 entries! 

The solution is simple: run factor() again: 
x <- factor(x) 
levels(x) 
Các vấn đề liên quan