2011-08-17 35 views
7

Tôi có một khung dữ liệu như x, nơi các gen cột là một yếu tố. Tôi muốn loại bỏ tất cả các hàng mà các gen cột không có gì. Vì vậy, trong bảng X tôi muốn loại bỏ hàng 4. Có cách nào để làm điều này cho một dataframe lớn?Xóa các hàng trong khung dữ liệu với hệ số ""

X 
names values genes 
1 A 0.2876113 EEF1A1 
2 B 0.6681894 GAPDH 
3 C 0.1375420 SLC35E2 
4 D -1.9063386   
5 E -0.4949905 RPS28 

Cuối cùng kết quả:

X 
names values genes 
1 A 0.2876113 EEF1A1 
2 B 0.6681894 GAPDH 
3 C 0.1375420 SLC35E2 
5 E -0.4949905 RPS28 

Cảm ơn tất cả các bạn!

Trả lời

22

Nó không hoàn toàn rõ ràng từ câu hỏi của bạn các giá trị rỗng là gì, nhưng bạn sẽ có thể áp dụng các giải pháp dưới đây (ở đây tôi giả sử các giá trị 'rỗng' là chuỗi rỗng):

toBeRemoved<-which(X$genes=="") 
X<-X[-toBeRemoved,] 
+0

Đó là chính xác wat i cần thiết! cảm ơn Nick Sabbe! – Lisann

+2

Tôi nghĩ rằng bạn có thể muốn một 'droplevels()' xung quanh để loại bỏ '' "* cấp *:' droplevels (X [-toBeRemoved,]) ' –

+4

Hoặc, bạn có thể làm' tập con (X, gen ! = "") ' – nullglob

10

@Nick Sabbe cung cấp một câu trả lời tuyệt vời, nhưng nó có một caveat:

Sử dụng -which(...) là một thủ thuật gọn gàng để (đôi khi) tăng tốc độ hoạt động subsetting khi chỉ có một vài yếu tố để loại bỏ.

... Nhưng nếu có không có các thành phần để xóa thì không thành công!

Vì vậy, nếu X$geneskhông chứa bất kỳ chuỗi trống nào, which sẽ trả lại một số nguyên trống. Bỏ qua đó vẫn là một vectơ trống rỗng. Và X [số nguyên (0)] trả về một data.frame trống!

toBeRemoved <- which(X$genes=="") 
if (length(toBeRemoved>0)) { # MUST check for 0-length 
    X<-X[-toBeRemoved,] 
} 

Hoặc, nếu đạt được tốc độ là không quan trọng, chỉ cần:

X<-X[X$genes!="",] 

Hoặc, như @nullglob chỉ ra,

subset(X, genes != "") 
+0

Tuyệt vời báo trước. Cũng có thể là 'if (length (toBeRemoved)) {'. Quan sát thêm: sử dụng 'tập hợp con' cũng loại bỏ tất cả các hàng có 'is.na (X $ genes)' là TRUE. –

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