2012-04-02 68 views
19

Tôi có vấn đề để giải quyết cách xóa các hàng có giá trị bằng 0. Trong các tay khác, tôi có thể sử dụng na.omit() để xóa tất cả các giá trị NA hoặc sử dụng complete.cases() để xóa các hàng có chứa giá trị NA.Làm thế nào để loại bỏ các hàng với một giá trị Zero trong R?

Có ai biết cách xóa các hàng có Giá trị bằng không trong R không?

Ví dụ:

Trước

| DateTime  | Mac1 | Mac2 | Mac3 | Mac4 | 
---------------------------------------------------- 
| 2011-04-02 06:00 | 20 | 0  | 20 | 20 | 
| 2011-04-02 06:05 | 21 | 21 | 21 | 21 | 
| 2011-04-02 06:10 | 22 | 22 | 22 | 22 | 
| 2011-04-02 06:15 | 23 | 23 | 0  | 23 | 
| 2011-04-02 06:20 | 24 | 24 | 24 | 24 | 
| 2011-04-02 06:25 | 0  | 25 | 25 | 0  | 

Sau

| DateTime  | Mac1 | Mac2 | Mac3 | Mac4 | 
---------------------------------------------------- 
| 2011-04-02 06:05 | 21 | 21 | 21 | 21 | 
| 2011-04-02 06:10 | 22 | 22 | 22 | 22 | 
| 2011-04-02 06:20 | 24 | 24 | 24 | 24 | 
+1

Một tuyến đường: giảm điều này thành sự cố bạn đã giải quyết bằng cách thay thế số 0 bằng NA. – joran

+0

Cảm ơn Joran, vì câu trả lời của bạn .. Nhưng, tôi không hiểu, ý nghĩa của việc thay thế số không bằng NA? Bởi vì trước khi tôi nhận được bảng tôi đã xóa các giá trị NA trước đây. Nhưng vẫn còn giá trị 0. Bạn có thể cho tôi biết cách thực hiện không? – YougyZ

+0

Ok tôi nghĩ rằng tôi phải sử dụng mã này để thay thế 0 bằng NA .. 'dữ liệu [mà (dữ liệu == 0)] = NA' – YougyZ

Trả lời

27

Có một vài cách khác nhau để làm điều này. Tôi thích sử dụng apply, vì nó dễ dàng mở rộng:

##Generate some data 
dd = data.frame(a = 1:4, b= 1:0, c=0:3) 

##Go through each row and determine if a value is zero 
row_sub = apply(dd, 1, function(row) all(row !=0)) 
##Subset as usual 
dd[row_sub,] 
4

Vâng, bạn có thể trao đổi bạn 0 's cho NA và sau đó sử dụng một trong những giải pháp, nhưng vì lợi ích của một sự khác biệt, bạn có thể nhận thấy rằng một số sẽ chỉ có lôgarít hữu hạn nếu nó lớn hơn 0, sao cho rowSums của log sẽ chỉ hữu hạn nếu không có số không trong một hàng.

dfr[is.finite(rowSums(log(dfr[-1]))),] 
+1

+1 cho thông minh, nhưng tôi chắc chắn sẽ thích một giải pháp 'all' /' any' trong thực tế ... –

4

Tôi có thể đi với đề xuất của Joran thay thế 0 bằng NA và sau đó sử dụng các chức năng được tích hợp mà bạn đã đề cập. Nếu bạn không thể/không muốn làm điều đó, một cách tiếp cận là sử dụng any() để tìm hàng có chứa 0 và nhóm những người ra:

set.seed(42) 
#Fake data 
x <- data.frame(a = sample(0:2, 5, TRUE), b = sample(0:2, 5, TRUE)) 
> x 
    a b 
1 2 1 
2 2 2 
3 0 0 
4 2 1 
5 1 2 
#Subset out any rows with a 0 in them 
#Note the negation with ! around the apply function 
x[!(apply(x, 1, function(y) any(y == 0))),] 
    a b 
1 2 1 
2 2 2 
4 2 1 
5 1 2 

Để thực hiện phương pháp Joran của, một cái gì đó như thế này sẽ giúp bạn bắt đầu :

x[x==0] <- NA 
+0

thanks anyway, nhưng tôi đã làm nó với giải pháp csgillespie ..;) – YougyZ

0

tôi muốn có một sự thích nghi đơn giản của phương pháp csgillespie của, nói trên nhu cầu của định nghĩa hàm:

d[apply(d!=0, 1, all),] 

nơi d là bạn r khung dữ liệu.

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