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.