2011-11-29 27 views
55

Đây là một đoạn mã nhỏ mà tôi đã viết để báo cáo các biến có giá trị bị thiếu từ một khung dữ liệu. Tôi đang cố gắng để nghĩ ra một cách thanh lịch hơn để làm điều này, người ta có lẽ trả về một data.frame, nhưng tôi bị mắc kẹt:Cách thanh lịch để báo cáo giá trị bị thiếu trong một data.frame

for (Var in names(airquality)) { 
    missing <- sum(is.na(airquality[,Var])) 
    if (missing > 0) { 
     print(c(Var,missing)) 
    } 
} 

Chỉnh sửa: Tôi đang đối phó với data.frames với hàng chục đến hàng trăm biến số, do đó, điều quan trọng là chúng tôi chỉ báo cáo các biến có giá trị bị thiếu.

+5

làm thế nào về 'tóm tắt (Dữ liệu) '? – kohske

+0

@ kohske: đó là suy nghĩ đầu tiên của tôi, nhưng kết quả là một bảng 'của các nhân vật và bạn sẽ phải phân tích số lượng NA. –

+0

Tôi đang hoàn nguyên câu hỏi của bạn, vì bạn đã đăng câu trả lời. Nếu bạn muốn bình luận về một câu trả lời, hãy làm như vậy như một bình luận cho câu trả lời đó. Nếu câu hỏi cũng chứa câu trả lời, điều này trở nên rất khó hiểu. – Andrie

Trả lời

115

Chỉ cần sử dụng sapply

> sapply(airquality, function(x) sum(is.na(x))) 
    Ozone Solar.R Wind Temp Month  Day 
    37  7  0  0  0  0 

Bạn cũng có thể sử dụng apply hoặc colSums trên ma trận được tạo ra bởi is.na()

> apply(is.na(airquality),2,sum) 
    Ozone Solar.R Wind Temp Month  Day 
    37  7  0  0  0  0 
> colSums(is.na(airquality)) 
    Ozone Solar.R Wind Temp Month  Day 
    37  7  0  0  0  0 
+10

Tôi đã sửa đổi mã của bạn một chút, để chỉ báo cáo giá trị còn thiếu: 'M <- sapply (airquality, hàm (x) sum (is.na (x))); M [M> 0] ' – Zach

+0

Cảm ơn! Đã học hỏi được rất nhiều. –

+0

Xin chào @Joshua Ulrich, cảm ơn rất nhiều vì mã ngắn gọn của bạn. Tôi muốn thêm một cột trong khung dữ liệu sẽ hiển thị phần trăm giá trị na. Bạn có thể vui lòng cung cấp một số trợ giúp về vấn đề này không? – DukeLover

0

Nếu bạn muốn làm điều đó cho cột cụ thể, sau đó bạn cũng có thể sử dụng này

length(which(is.na(airquality[1])==T)) 
+3

Bạn không cần phải so sánh vectơ logic với T. Bạn cũng có thể đếm số lượng các phần tử TRUE trong một vector hợp lý bằng cách tổng hợp nó. – Houshalter

4

More succinct-: sum(is.na(x[1]))

Đó là

  1. x[1] Nhìn vào cột đầu tiên

  2. is.na() đúng nếu nó NA

  3. sum()TRUE1, FALSE0

+0

điều này không trả lời câu hỏi ban đầu, đó là để tìm số 'NA' cho * tất cả * cột trong dữ liệu –

2
summary(airquality) 

đã cung cấp cho bạn thông tin này

Các VIM gói cũng cung cấp một số âm mưu dữ liệu bị mất tốt đẹp cho data.frame

library("VIM") 
aggr(airquality) 

enter image description here

+0

Gói VIM có thể báo cáo quan sát cụ thể nào có dữ liệu bị thiếu không? –

+0

không nghĩ như vậy .. nhưng bạn có thể nhận được điều này khá dễ dàng (bạn sẽ phải thay thế airquality với dataframe của riêng bạn): res <- airquality [rowSums (is.na (airquality))> 0,] – stats0007

2

Chúng ta có thể sử dụng map_df với purrr.

library(mice) 
library(purrr) 

# map_df with purrr 
map_df(airquality, function(x) sum(is.na(x))) 
# A tibble: 1 × 6 
# Ozone Solar.R Wind Temp Month Day 
# <int> <int> <int> <int> <int> <int> 
# 1 37  7  0  0  0  0 
+0

lợi thế là gì của 'map_df' trên' sapply'? – Zach

+0

@Zach Tôi nghĩ rằng không có sự khác biệt lớn, nhưng Hadley nói không sử dụng sapply() bên trong một hàm. Xem Ngoại lệ và gỡ lỗi · Nâng cao R. http://adv-r.had.co.nz/Exceptions-Debugging.html. – Keiku

2

Một chức năng mà có thể giúp bạn nhìn vào dữ liệu bị mất sẽ df_status từ thư viện funModeling

library(funModeling) 

iris.2 là dataset iris với một số bổ sung NAs.You có thể thay thế này với bộ dữ liệu của bạn.

df_status(iris.2) 

Điều này sẽ cung cấp cho bạn số lượng và phần trăm NA trong mỗi cột.

0

Tôi nghĩ thư viện Amelia thực hiện một công việc tốt trong việc xử lý dữ liệu bị thiếu cũng bao gồm một bản đồ để hiển thị các hàng bị thiếu.

install.packages("Amelia") 
library(Amelia) 
missmap(airquality) 

enter image description here

Bạn cũng có thể chạy các đoạn mã sau sẽ trả lại giá trị logic của na

row.has.na <- apply(training, 1, function(x){any(is.na(x))}) 
0

Để biết thêm một giải pháp đồ họa, visdatpackage cung cấp vis_miss.

library(visdat) 
vis_miss(airquality) 

enter image description here

Rất giống với Amelia đầu ra với một sự khác biệt nhỏ cho% s trên missings ra khỏi hộp.

2

Một đồ họa thay thế - plot_missing chức năng từ tuyệt vời DataExplorer gói:

enter image description here

Docs cũng chỉ ra thực tế là bạn có thể lưu kết quả này để phân tích bổ sung với missing_data <- plot_missing(data).

+0

Hàm 'plot_missing()' trong gói 'DataExplorer' bây giờ là' PlotMissing() '. – coip

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