Bỏ qua các hàng chứa cột cụ thể của NA


129

Tôi muốn biết cách bỏ qua NAcác giá trị trong khung dữ liệu, nhưng chỉ trong một số cột tôi quan tâm.

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.omitdường như xóa tất cả các hàng chứa bất kỳ NA.

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

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 chỉ muốn bỏ qua x=nahoặc z=na, tôi có thể đặt |chức năng ở đâu?

Câu trả lời:


79

Bạn có thể sử dụng complete.caseshàm và đặt nó vào một hàm như vậy:

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ả về các hàng không có NAs

Nếu bạn muốn loại bỏ tất cả các hàng có ít nhất một hàng NAtrong bất kỳ cột nào, chỉ cần sử dụng complete.caseshàm thẳng lên:

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

Hoặc nếu completeFunđã ăn sâu vào quy trình làm việc của bạn;)

completeFun(DF, names(DF))

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 nào cả.
Léo Léopold Hertz

1
Bạn có nghĩa là chỉ trả về hàng không có NAs? Giống như completeFun(DF, names(DF))?
BenBarnes

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ì đó là một nhu cầu phổ biến ở đây. - - Tôi nghĩ 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!
Léo Léopold Hertz

1
Làm xong! Thx cho tiền boa @ LéoLéopoldHertz
BenBarnes 18/07/17

192

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),]

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

2
Sử dụng na.omitđể tham lam xóa tất cả các hàng có NA trong bất kỳ cột nàona.omit(DF)
M. Viking

68

Hadley tidyrchỉ có chức năng tuyệt vời nàydrop_na

library(tidyr)
DF %>% drop_na(y)
  x  y  z
1 1  0 NA
2 2 10 33

30

Sử dụng 'tập hợp con'

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

9

Có thể sử dụng na.omitcho data.table:

na.omit(data, cols = c("x", "z"))

3
các cols=đối số là có sẵn trong data.table::na.omitthư viện. Không phải là cơ sở stats::na.omit.
M. Viking


2

Bỏ qua hàng nếu một trong hai cột cụ thể chứa <NA>.

DF[!is.na(DF$x)&!is.na(DF$z),]

1

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

DF %>% t %>% na.omit %>% t

Nó hoán chuyển khung dữ liệu và bỏ qua các hàng null là 'cột' trước khi hoán vị và sau đó bạn chuyển nó trở lại.


8
Hãy giải thích một chút những gì đang xảy ra.
vonbrand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.