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?

pengguna1489975
sumber

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))
BenBarnes
sumber
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),]
mnel
sumber
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
amrrs
sumber
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))
Rnoob
sumber
9

Dimungkinkan untuk digunakan na.omituntuk data.table:

na.omit(data, cols = c("x", "z"))
Droney
sumber
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,]
rockswap
sumber
2

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

DF[!is.na(DF$x)&!is.na(DF$z),]
M. Viking
sumber
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.

Leon Qi
sumber
9
Tolong jelaskan sedikit apa yang sedang terjadi.
vonbrand