2011-11-02 53 views
55

Chúng tôi có khung dữ liệu từ tệp CSV. Khung dữ liệu DF có các cột chứa giá trị được quan sát và cột (VaR2) có chứa ngày mà một phép đo đã được thực hiện. Nếu ngày không được ghi lại, tệp CSV chứa giá trị NA, vì thiếu dữ liệu.Tập hợp các hàng chứa các giá trị NA (thiếu) trong cột đã chọn của khung dữ liệu

Var1 Var2 
10 2010/01/01 
20 NA 
30 2010/03/01 

Chúng tôi muốn sử dụng lệnh tập hợp con để xác định một khung dữ liệu mới new_DF như vậy mà nó chỉ chứa các hàng có giá trị NA' từ cột (VaR2). Trong ví dụ được đưa ra, chỉ có Hàng 2 mới được chứa trong DF mới.

Lệnh

new_DF<-subset(DF,DF$Var2=="NA") 

không hoạt động, khung dữ liệu kết quả không có bài liên tiếp.

Nếu trong tệp CSV gốc giá trị NA được trao đổi với NULL, cùng một lệnh tạo kết quả mong muốn: new_DF<-subset(DF,DF$Var2=="NULL").

Làm cách nào để phương thức này hoạt động, nếu đối với chuỗi ký tự, giá trị NA được cung cấp trong tệp CSV gốc?

Trả lời

92

Không bao giờ sử dụng == 'NA' để kiểm tra các giá trị bị thiếu. Sử dụng is.na() để thay thế. Điều này sẽ làm điều đó:

new_DF <- DF[rowSums(is.na(DF)) > 0,] 

hoặc trong trường hợp bạn muốn kiểm tra một cột cụ thể, bạn cũng có thể sử dụng

new_DF <- DF[is.na(DF$Var),] 

Trong trường hợp bạn có NA các giá trị nhân vật, chạy đầu tiên

Df[Df=='NA'] <- NA 

để thay thế chúng bằng các giá trị bị thiếu.

+2

Cảm ơn câu trả lời nhanh của bạn (điều này thật nhanh)!Thật vậy, do việc phân phối dữ liệu csv, 'NA' là các giá trị ký tự và câu lệnh thứ hai của bạn có thể rất hữu ích. Bạn cũng có thể làm rõ tuyên bố đầu tiên của mình không? Việc sử dụng rowSums() không rõ ràng đối với tôi, vì tôi sẽ chỉ kiểm tra một cột cụ thể (có rất nhiều cột). Nếu cột cụ thể đó (trong ví dụ nó sẽ là cột Var2) có chuỗi ký tự 'NA' (tôi sẽ thay thế nó bằng câu lệnh thứ hai của bạn), thì tôi muốn chọn toàn bộ hàng là một phần của khung dữ liệu mới . – John

+0

@John: đã cập nhật. Điểm này là sử dụng is.na, tôi giải thích sai bạn muốn kiểm tra tất cả các biến. –

+3

nên là 'new_DF <- DF [is.na (DF $ Var),]', có nghĩa là có vẻ là một '(' ngoặc sau 'DF ['? – PatrickT

34

NA là một giá trị đặc biệt trong R, không trộn lẫn giá trị NA với chuỗi "NA". Tùy thuộc vào cách dữ liệu được nhập, các ô "NA" và "NULL" của bạn có thể thuộc loại khác nhau (hành vi mặc định là chuyển chuỗi "NA" thành giá trị NA và để chuỗi "NULL").

Nếu sử dụng read.table() hoặc read.csv(), bạn nên xem xét đối số "na.strings" để nhập dữ liệu sạch và luôn hoạt động với các giá trị R NA thực.

Một ví dụ, làm việc trong cả hai trường hợp "NULL" và các tế bào "NA":

DF <- read.csv("file.csv", na.strings=c("NA", "NULL")) 
new_DF <- subset(DF, is.na(DF$Var2)) 
+1

Cảm ơn câu trả lời của bạn. Nếu tôi hiểu nó đúng câu lệnh đầu tiên sẽ làm giống như Df [Df == 'NA'] <- NA trong ví dụ của Joris? Sự khác biệt (nhỏ) sau đó sẽ là nó được thực hiện trong statecly statecly của bạn ngay từ đầu, khi khung dữ liệu được tạo ra (đây là một phương pháp lập trình rất sạch sẽ và do đó tôi thích nó) – John

+0

Chính xác, Joris đề nghị thay thế các chuỗi "NA" bằng các giá trị NA theo cách thủ công, ở đây tôi chỉ đề nghị sử dụng tính năng "na.strings" của read.table() để đạt được mục đích tương tự – maressyl

+0

Câu trả lời của Joris thực sự là cách "ưa thích" để đạt được thành tích này (nếu bạn đang viết điều này trong một kịch bản). Xem: http://stackoverflow.com/questions/9860090/in- r-why-is-better-than-subset – Jonathan

-1

In tất cả các hàng với dữ liệu NA:

tmp <- data.frame(c(1,2,3),c(4,NA,5)); 
tmp[round(which(is.na(tmp))/ncol(tmp)),] 
+0

@ZheyuanLi Nếu bạn không thích câu trả lời, chỉ cần bỏ phiếu xuống. Chỉnh sửa câu trả lời để đề xuất gắn cờ KHÔNG phải là hành động thích hợp. Để lại một bình luận nếu bạn cảm thấy cần thiết. –

5

complete.cases cho TRUE khi tất cả các giá trị trong một hàng không phải là NA

DF[!complete.cases(DF), ] 
+0

Đến nay là nhanh nhất. –

1

Hãy thử thay đổi điều này:

new_DF<-dplyr::filter(DF,is.na(Var2)) 
+0

Bạn có thể giải thích lý do tại sao điều này hoạt động, điều này có tác dụng gì không? – csilk

+0

new_DF <-dplyr :: filter (DF, is.na (Var2)) về cơ bản sử dụng chức năng lọc của gói dplyr và lọc ra bất kỳ quan sát nào trong cột Var2 thỏa mãn điều kiện is.na nghĩa là chúng chọn tất cả các quan sát với NA – drhnis

+0

Được trình bày rõ ràng hơn là bộ lọc 'DF%>% (is.na (Var2))' sau 'thư viện (dplyr) '. – Joe

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