2011-07-22 34 views
5

Làm cách nào để đặt một khung dữ liệu sao cho chỉ các hàng chứa các cột có giá trị hiển thị một số lần nhất định trong các hàng khác được bao gồm.Làm cách nào để lọc một khung dữ liệu dựa trên các loại danh mục

Ví dụ: nếu tôi có cột có gắn nhãn Thực phẩm, làm cách nào để lọc tất cả các hàng có thực phẩm hiển thị dưới 5 lần trong toàn bộ khung dữ liệu?

+0

Tôi dự đoán giải pháp sẽ liên quan đến 'table' và'% in% '. – joran

+0

@Joran: Ya, điều đầu tiên tôi làm là tạo một bảng, chỉ không chắc chắn cách kết nối đó như một cách để lọc khung dữ liệu. –

Trả lời

8

Dưới đây là một ví dụ nhanh:

dat <- data.frame(x=runif(50),y=sample(letters,50,replace = TRUE)) 
dat[dat$y %in% names(table(dat$y))[table(dat$y) > 2],] 

Đó chọn tất cả các hàng có chứa một bức thư xuất hiện nhiều hơn hai lần.

+0

Bạn có dự đoán câu trả lời của riêng mình không? Và điều đó có được tính là sự thật không? Tôi sẽ upvote anyway, bởi vì câu trả lời của bạn là đơn giản và hoạt động. – Seth

+1

@Seth - Tôi đang chờ đợi để có được (trở lại) trên một chiếc máy bay, vì vậy tôi bắt đầu với một bình luận, nghĩ rằng tôi sẽ không có thời gian để biết thêm. Nhưng sau đó có vẻ như tôi đã có một vài phút, vì vậy tôi đã viết câu trả lời ... tại thời điểm này tôi dự đoán rằng tôi sẽ có một ngày rất dài ở các sân bay. :( – joran

+0

Hoạt động, chỉ báo trước trong trường hợp của tôi (mà tôi không nói) là vì đây là một yếu tố, ô mẫu vẫn hiển thị tất cả các cấp dọc theo trục X, thay vì chỉ các giá trị có giá trị –

1

Tôi là người hâm mộ của ave về các vấn đề như thế này. Sử dụng dữ liệu mẫu từ câu trả lời của @ joran:

set.seed(21) 
dat <- data.frame(x=runif(50), y=sample(letters,50,replace=TRUE)) 
foo <- dat[dat$y %in% names(table(dat$y))[table(dat$y) > 2],] 
bar <- subset(dat, ave(rep(1,nrow(dat)), dat$y, FUN=sum) > 2) 
identical(foo,bar) 
# [1] TRUE 
6

Đây là một cách tiếp cận khác (có thể là sạch hơn) sử dụng plyr.

ddply(dat, .(y), subset, length(x) > 2) 
Các vấn đề liên quan