2012-03-02 86 views
5

Tôi có một data.frame như thế này:Trong R, có cách nào để xử lý NA trong một cột nguyên của một data.frame sao cho các giá trị NA không được bao gồm khi subsetting?

(t=structure(list(count = c(NA, 2, NA, NA, NA, 8, NA, NA, NA)), .Names = "count", row.names = c(NA,-9L), class = "data.frame")) 
    count 
1 NA 
2  2 
3 NA 
4 NA 
5 NA 
6  8 
7 NA 
8 NA 
9 NA 

Thật tuyệt vời khi R có giá trị NA nhưng đôi khi nó cắn tôi. Tôi thường quên điều đó và cố gắng làm dịu như thế này

> t[t$count>=1,] 
[1] NA 2 NA NA NA 8 NA NA NA 

Và đầu ra bao gồm tất cả các hàng NA. (mà tôi không thích)

Sau một giờ tìm kiếm lỗi, tôi thay đổi mã này và đó là những gì tôi muốn (hãy tưởng tượng khung dữ liệu lớn "NAS):

> t[t$count>=1&!is.na(t$count),] 
[1] 2 8 

1. có một tính năng của "" chức năng as.integer để tôi có thể làm điều gì đó như thế này:

t [as.integer.EXCLUDE.NA (t $ count)> = 1,]

Tôi cũng muốn sử dụng tính năng này trong các hàm as.xxxx khác. Về cơ bản buộc R ngừng suy nghĩ như một thống kê và xử lý NA khác nhau (ví dụ như NULL (Tôi không chắc NULL sẽ giải quyết vấn đề của tôi) (điều này không hoạt động: t $ count [3] < -NULL vì lý do nào)

2. hoặc làm thế nào tôi sẽ chạy

transform(t, replace all NAs from count columns with 0) 

hoặc thậm chí tốt hơn

transform(t, replace all NA from all numeric columns with 0 in t) 

3. bất kỳ ý kiến ​​chung vào việc R quên NA được hoan nghênh?

+0

Tôi thấy giá trị của NA, nhưng có các tập dữ liệu mà NA không được hoan nghênh. – userJT

+1

Nhưng làm thế nào để bạn muốn xử lý chúng - Thả từng NA? Thả từng hàng nơi có bất kỳ NA nào? Xâm chúng? Đó là một quyết định quan trọng. –

Trả lời

6

tôi không thích những lựa chọn đã được thực hiện tại thời gian thiết kế cách "[" xử lý giá trị NA. Cách tiếp cận tôi thực hiện khi tôi muốn trích xuất các giá trị bằng cách sử dụng phép thử lôgic là bọc biểu thức logic vào which. Này chuyển kết quả vào một tập hợp các số và lập chỉ mục thành công mà không cần kéo dọc theo mong muốn của NA:

> t[ which(t$count >= 1), ] 
[1] 2 8 
# Or if you still want a dataframe result 
> t[ which(t$count >= 1), , drop=FALSE] 
    count 
2  2 
6  8 

tôi cũng sử dụng subset vì nó xử lý NA trong cùng một cách thức như which(logical). Một trong những gotcha là khi which được sử dụng với một dấu "-" để lấy bộ bổ sung. Nếu không có phần tử nào trong tập hợp thỏa mãn điều kiện logic, thì cũng sẽ không có phần tử nào trong dạng -which(logical). Vì vậy, tôi không sử dụng combo -which:

> t[ -which(t$count < 1), , drop=FALSE] 
[1] count 
<0 rows> (or 0-length row.names) 
> t[ which(t$count < 1), , drop=FALSE] 
[1] count 
<0 rows> (or 0-length row.names) 
+0

Tôi đã sử dụng tập con() và sau đó chuyển sang [] vì nó nhanh hơn. Nhưng câu trả lời của bạn làm cho một điểm tuyệt vời để quay trở lại tập hợp con() trong một số trường hợp – userJT

3

đủ dễ dàng để làm (2) trên danh sách (thay thế tất cả NAS):

t$count[is.na(t$count)] <- something.else 

Câu hỏi đặt ra là, tất nhiên, những gì bạn đưa vào cho something.else. NA tồn tại để giải quyết vấn đề. Nếu bạn muốn chăn cấm chúng khỏi việc sử dụng R, bạn sẽ cần phải tìm ra những gì bạn muốn làm với các quan sát còn thiếu khác hơn là coi chúng là thiếu.

Vẻ đẹp của NA thường được tuyên truyền thông qua, cho bạn biết ở phần cuối của phân tích của bạn rằng ở đâu đó trong đó bạn có một số thiếu sót mà bạn nên suy nghĩ kỹ. Không có thay thế cho suy nghĩ khó khăn về sự mất tích.

+1

+1 cho lời giải thích của bạn, và để có thể nhìn thấy vẻ đẹp trong NAs :) –

+0

Nếu bước đầu tiên trên đường dẫn đến giác ngộ đang được vui mừng về sự tồn tại của thông báo lỗi, và bước thứ hai là nhìn thấy vẻ đẹp trong NA, bước thứ ba? –

+0

Aha! Một R [koan] (http://en.wikipedia.org/wiki/K%C5%8Dan). Cảm ơn! –

5

Trong data.table, nó hoạt động như bạn muốn sử dụng.r.t. NA, nếu tôi hiểu chính xác. Ngoài ra, bạn không cần phải sử dụng $ và cũng không phiền nếu bạn quên dấu phẩy.

dt = as.data.table(t) 
t[count>=1] # NA's are treated as FALSE 

Danh sách các khác biệt giữa data.tabledata.frame là trong FAQ 2.17 here.

Nếu bạn đang nghĩ đến tất cả những khác biệt này, chúng sẽ không tương thích.Bạn vẫn có thể chuyển một gói data.table cho bất kỳ gói nào và khi các gói đó sử dụng cú pháp R chuẩn trên data.table, nó vẫn hoạt động.

Vì bạn đã nói lớndata.frame, data.table có thể đáng xem.

Đây là 3 điểm từ FAQ 2.17 (nơi DT nghĩa data.tableDF nghĩa data.frame):

  • DT[NA] lợi nhuận 1 dãy NA, nhưng DF[NA] trả về một bản sao của toàn bộ DF chứa NA khắp. Biểu tượng NA là loại hợp lý trong R và là do đó được tái chế bởi [.data.frame. Ý định có thể là DF[NA_integer_]. [.data.table thực hiện điều này tự động cho tiện ích .

  • DT[c(TRUE,NA,FALSE)] xử lý các NA như FALSE, nhưng DF[c(TRUE,NA,FALSE),] lợi nhuận một hàng NA cho mỗi NA

  • DT[ColA==ColB] là đơn giản hơn DF[!is.na(ColA) & !is.na(ColB) & ColA==ColB,]

+0

Thx. Tuy nhiên, một xung khác để xem xét data.table – userJT

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