2013-09-03 55 views
6

Giả sử tôi có tập dữ liệu có cột 100 lẻ và tôi chỉ cần giữ những hàng trong dữ liệu đáp ứng một điều kiện được áp dụng trên tất cả 100 cột .. Làm cách nào để thực hiện việc này?Lọc các hàng dựa trên nhiều điều kiện cột R

Giả sử, nó giống như dưới đây ... Tôi cần phải chỉ giữ hàng nơi một trong hai col1 hoặc 2 hoặc 3 hoặc 4 là> 0

Col1 Col2 Col3 Col4 
1 1 3 4 
0 0 4 2 
4 3 4 3 
2 1 0 2 
1 2 0 3 
0 0 0 0 

Trong ví dụ trên, ngoại trừ hàng cuối cùng tất cả các hàng sẽ làm cho nó .. Tôi cần phải đặt kết quả trong cùng một dataframe như ban đầu. không chắc chắn nếu tôi có thể sử dụng lapply để lặp qua các cột nơi> 0 hoặc tôi có thể sử dụng tập hợp con. Bất kỳ trợ giúp nào được đánh giá là

Tôi có thể sử dụng chỉ mục cột và làm df<-subset(df,c(2:100)>0). Điều này không cho tôi kết quả đúng.

Trả lời

11

Giả sử data.frame của bạn là DF sau đó sử dụng [ sẽ thực hiện công việc cho bạn.

> DF[DF[,1]>0 | DF[,2] >0 | DF[,3] >0 | DF[,4] >0, ] 
    Col1 Col2 Col3 Col4 
1 1 1 3 4 
2 0 0 4 2 
3 4 3 4 3 
4 2 1 0 2 
5 1 2 0 3 

Nếu bạn có hàng trăm cột mà bạn có thể sử dụng phương pháp thay thế này

> DF[rowSums(DF)=!0, ] 
    Col1 Col2 Col3 Col4 
1 1 1 3 4 
2 0 0 4 2 
3 4 3 4 3 
4 2 1 0 2 
5 1 2 0 3 
+1

Hey Jilber, nếu tôi có 100 cột lẻ, tôi có nên nhập nội dung 100 lần không? .. Không chắc chắn lý tưởng .. hãy cho tôi biết – kaos1511

+0

Bạn cần tạo khung dữ liệu hoặc ma trận nếu bạn có nhiều vectơ ... –

+0

Trong khi giải pháp đầu tiên hoạt động cho tất cả các số thực, giải pháp thứ hai được giới hạn ở các số không âm. –

2
dat <- read.table(header = TRUE, text = " 
    Col1 Col2 Col3 Col4 
    1 1 3 4 
    0 0 4 2 
    4 3 4 3 
    2 1 0 2 
    1 2 0 3 
    0 0 0 0 
") 

Bạn có thể sử dụng để tự động data.table chứa Tuy nhiên nhiều cột data.frame của bạn xảy ra để có. Đây là một cách nhưng có lẽ một phương pháp thanh lịch hơn để thực hiện việc này với data.table:

require(data.table) 
dt <- data.table(dat) 

dt[rowSums(dt>0)>0] 

# Col1 Col2 Col3 Col4 
# 1: 1 1 3 4 
# 2: 0 0 4 2 
# 3: 4 3 4 3 
# 4: 2 1 0 2 
# 5: 1 2 0 3 
Các vấn đề liên quan