2012-06-29 35 views
70

Tôi muốn biết làm thế nào để bỏ qua NA giá trị trong một khung dữ liệu, nhưng chỉ trong một số cột mà tôi quan tâm.hàng Bỏ qua chứa cột cụ thể của NA

Ví dụ,

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 

nhưng tôi chỉ muốn bỏ qua các dữ liệu mà yNA, do đó kết quả nên

x y z 
1 1 0 NA 
2 2 10 33 

na.omit dường như xóa tất cả các hàng con tain bất kỳ NA.

Ai đó có thể giúp tôi trong câu hỏi đơn giản này không?

Nhưng nếu bây giờ tôi thay đổi câu hỏi như:

DF <- data.frame(x = c(1, 2, 3,NA), y = c(1,0, 10, NA), z=c(43,NA, 33, NA)) 

Nếu tôi muốn bỏ qua chỉ x=na hoặc z=na, nơi tôi có thể đặt | chức năng?

Trả lời

44

Bạn có thể sử dụng chức năng complete.cases và đặt nó vào một hàm thusly:

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 

completeFun <- function(data, desiredCols) { 
    completeVec <- complete.cases(data[, desiredCols]) 
    return(data[completeVec, ]) 
} 

completeFun(DF, "y") 
# x y z 
# 1 1 0 NA 
# 2 2 10 33 

completeFun(DF, c("y", "z")) 
# x y z 
# 2 2 10 33 

EDIT:Chỉ trả lại hàng không có NA s

Nếu bạn muốn loại bỏ tất cả các hàng với ít nhất một NA trong bất kỳ cột, chỉ cần sử dụng complete.cases chức năng thẳng lên:

DF[complete.cases(DF), ] 
# x y z 
# 2 2 10 33 

Hoặc nếu completeFun đã ăn sâu trong công việc của bạn;)

completeFun(DF, names(DF)) 
+0

Bạn có thể làm cho cách tiếp cận của bạn tham lam? Lấy tất cả các cột không có NA. –

+1

Bạn muốn trả lại * hàng * không có 'NA'? Giống như 'completeFun (DF, tên (DF))'? – BenBarnes

+0

Chính xác! Xin vui lòng, xem xét thêm nó vào câu trả lời của bạn bởi vì nó là một nhu cầu phổ biến ở đây. - - Tôi nghĩ rằng câu trả lời của mnel không thể được mở rộng như của bạn. Cách tiếp cận chức năng của bạn là tuyệt vời! –

133

Sử dụng is.na

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 
DF[!is.na(DF$y),] 
+0

Làm thế nào để bạn áp dụng phương pháp này tham lam trên tất cả các cột trong các dữ liệu thiết lập? Nếu bất kỳ giá trị cột nào là NA bỏ qua. Vì vậy, đầu ra bộ dữ liệu của bạn chỉ là cột thứ hai. –

3

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

cc=is.na(DF$y) 
m=which(cc==c("TRUE")) 
DF=DF[-m,] 
20

Sử dụng 'nhóm'

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 
subset(DF, !is.na(y)) 
19

Hadley của tidyr chỉ có chức năng tuyệt vời này drop_na

library(tidyr) 
DF %>% drop_na(y) 
    x y z 
1 1 0 NA 
2 2 10 33 
Các vấn đề liên quan