Abaikan baris yang berisi kolom khusus NA


130

Saya ingin tahu cara menghilangkan NAnilai dalam bingkai data, tetapi hanya di beberapa kolom saya tertarik.

Sebagai contoh,

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

tapi aku hanya ingin omit data mana yyang NA, oleh karena itu hasilnya harus

  x  y  z
1 1  0 NA
2 2 10 33

na.omitSepertinya hapus semua baris yang ada NA.

Adakah yang bisa membantu saya keluar dari pertanyaan sederhana ini?

Tetapi jika sekarang saya mengubah pertanyaan seperti:

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

Jika saya ingin mengabaikan saja x=naatau z=na, di mana saya dapat menempatkan |fungsi in?

Jawaban:


79

Anda bisa menggunakan complete.casesfungsi dan memasukkannya ke dalam fungsi sebagai berikut:

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: Hanya kembalikan baris tanpa NAs

Jika Anda ingin menghilangkan semua baris dengan setidaknya satu NAdi kolom mana pun, cukup gunakan complete.casesfungsi langsung ke atas:

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

Atau jika completeFunsudah tertanam dalam alur kerja Anda;)

completeFun(DF, names(DF))

Bisakah Anda membuat pendekatan Anda serakah? Ambil semua kolom yang tidak memiliki NAs sama sekali.
— Léo Léopold Hertz 준영

1
Maksudmu hanya mengembalikan baris tanpa NAs? Suka completeFun(DF, names(DF))?
— BenBarnes

Benar! Tolong, pertimbangkan untuk menambahkannya ke jawaban Anda karena ini adalah kebutuhan umum di sini. - - Saya pikir jawaban mnel tidak dapat diperluas seperti milik Anda. Pendekatan fungsi Anda luar biasa!
— Léo Léopold Hertz 준영

1
Selesai! Terima kasih atas tipnya @ LéoLéopoldHertz 준영
— BenBarnes

192

Menggunakan 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
Bagaimana Anda menerapkan pendekatan ini dengan rakus pada semua kolom dalam kumpulan data? Jika salah satu nilai kolomnya adalah NA, lewati. Jadi output set data Anda adalah kolom kedua saja.
— Léo Léopold Hertz 준영

2
Gunakan na.omituntuk dengan rakus menghapus semua baris dengan NA di kolom apa punna.omit(DF)
— M. Viking

69

Hadley tidyrbaru saja mendapatkan fungsi luar biasa inidrop_na

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

30

Gunakan 'subset'

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

9

Dimungkinkan untuk digunakan na.omituntuk data.table:

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

3
yang cols=argumen tersedia di data.table::na.omitperpustakaan. Bukan basis stats::na.omit.
— M. Viking

3

Coba ini:

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

2

Hapus baris jika salah satu dari dua kolom tertentu berisi <NA>.

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

1

Coba ini:

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

Transposisi frame data dan menghilangkan baris nol yang merupakan 'kolom' sebelum transposisi dan kemudian Anda memindahkannya kembali.


9
Tolong jelaskan sedikit apa yang sedang terjadi.
— vonbrand
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.