Subset baris yang berisi nilai NA (hilang) di kolom yang dipilih dari bingkai data

96

Kami memiliki bingkai data dari file CSV. Bingkai data DFmemiliki kolom yang berisi nilai yang diamati dan kolom ( VaR2) yang berisi tanggal di mana pengukuran telah dilakukan. Jika tanggal tidak direkam, file CSV berisi nilai NAuntuk data yang hilang.

Var1  Var2 
10   2010/01/01
20   NA
30   2010/03/01

Kami ingin menggunakan perintah subset untuk mendefinisikan bingkai data baru new_DFsehingga hanya berisi baris yang memiliki NA'nilai dari kolom ( VaR2). Dalam contoh yang diberikan, hanya Baris 2 yang akan dimuat di yang baru DF.

Perintah

new_DF<-subset(DF,DF$Var2=="NA") 

tidak berfungsi, bingkai data yang dihasilkan tidak memiliki entri baris.

Jika dalam file CSV aslinya Nilai NAdipertukarkan dengan NULL, perintah yang sama menghasilkan hasil yang diinginkan: new_DF<-subset(DF,DF$Var2=="NULL").

Bagaimana saya bisa mendapatkan metode ini bekerja, jika untuk string karakter nilainya NAdiberikan dalam file CSV asli?

John
sumber

Jawaban:

147

Jangan pernah gunakan == 'NA' untuk menguji nilai yang hilang. Gunakan is.na()sebagai gantinya. Ini harus melakukannya:

new_DF <- DF[rowSums(is.na(DF)) > 0,]

atau jika Anda ingin memeriksa kolom tertentu, Anda juga dapat menggunakan

new_DF <- DF[is.na(DF$Var),]

Jika Anda memiliki nilai karakter NA, jalankan dulu

Df[Df=='NA'] <- NA

untuk menggantinya dengan nilai yang hilang.

Joris Meys
sumber
2
Terima kasih atas jawaban cepat Anda (ini cepat)! Memang, karena pengiriman data csv, 'NA' adalah nilai karakter dan pernyataan kedua Anda mungkin sangat berguna. Bisakah Anda juga mengklarifikasi pernyataan pertama Anda? Penggunaan rowSums () tidak jelas bagi saya, karena saya hanya akan memeriksa kolom tertentu (ada banyak kolom). Jika kolom tertentu itu (dalam contoh itu adalah kolom Var2) memiliki string karakter 'NA' (saya akan menggantinya dengan pernyataan kedua Anda), maka saya ingin memilih seluruh baris untuk menjadi bagian dari bingkai data baru .
Yohanes
@ John: diperbarui. Intinya adalah menggunakan is.na, saya salah menafsirkan Anda ingin memeriksa semua variabel.
Joris Meys
3
haruskah demikian new_DF <- DF[is.na(DF$Var),], yaitu tampaknya ada tanda (kurung tambahan setelahnya DF[?
PatrickT
39

NA adalah nilai khusus di R, jangan mencampur nilai NA dengan string "NA". Bergantung pada cara data diimpor, sel "NA" dan "NULL" Anda mungkin memiliki berbagai jenis (perilaku defaultnya adalah mengubah string "NA" menjadi nilai NA, dan membiarkan string "NULL" sebagaimana adanya).

Jika menggunakan read.table () atau read.csv (), Anda harus mempertimbangkan argumen "na.strings" untuk melakukan impor data bersih, dan selalu bekerja dengan nilai R NA nyata.

Contoh, bekerja di kedua kasus sel "NULL" dan "NA":

DF <- read.csv("file.csv", na.strings=c("NA", "NULL"))
new_DF <- subset(DF, is.na(DF$Var2))
maressyl
sumber
1
Terima kasih atas jawaban anda. Jika saya memahaminya dengan benar, pernyataan pertama akan melakukan hal yang sama seperti Df [Df == 'NA'] <- NA dalam contoh Joris? Perbedaan (kecil) kemudian adalah bahwa itu dilakukan dalam pernyataan Anda langsung di awal, ketika bingkai data dibuat (ini adalah metode pemrograman yang sangat bersih dan karena itu saya menyukainya).
Yohanes
Persis. Joris menyarankan untuk mengganti string "NA" dengan nilai NA secara manual, disini saya hanya menyarankan untuk menggunakan fitur "na.strings" dari read.table () untuk mencapai tujuan yang sama.
maressyl
Jawaban Joris sebenarnya adalah cara yang "disukai" untuk mencapai prestasi ini (jika Anda menulis ini dalam skrip). Lihat: stackoverflow.com/questions/9860090/…
Jonathan
@Jonathan: Dua ide berbeda di sini, topik yang Anda kutip mengatakan "[" harus lebih disukai pada "subset", tetapi kami berbicara tentang argumen "na.strings" di read.table (), subset saya ada di sini hanya untuk memvisualisasikan efeknya.
maressyl
33

complete.casesmemberikan TRUEketika semua nilai dalam satu baris tidakNA

DF[!complete.cases(DF), ]
pengguna3226167
sumber
12
new_data <- data %>% filter_all(any_vars(is.na(.))) 

Ini harus membuat bingkai data baru ( new_data) dengan hanya nilai yang hilang di dalamnya.

Berfungsi paling baik untuk melacak nilai yang mungkin Anda keluarkan nanti karena memiliki beberapa kolom dengan observasi yang hilang (NA).

Ronak Pol
sumber
3

Coba ubah ini:

new_DF<-dplyr::filter(DF,is.na(Var2)) 
drhnis
sumber
Bisakah Anda menjelaskan mengapa ini berhasil, apa fungsinya, dll.?
csilk
new_DF <-dplyr :: filter (DF, is.na (Var2)) pada dasarnya menggunakan fungsi filter dari paket dplyr dan menyaring observasi di kolom Var2 yang memenuhi kondisi is.na yaitu mereka mengambil semua observasi dengan NA
drhnis
1
Lebih baik diungkapkan DF %>% filter(is.na(Var2))setelahnya library(dplyr).
Joe
-1

Mencetak semua baris dengan data NA:

tmp <- data.frame(c(1,2,3),c(4,NA,5));
tmp[round(which(is.na(tmp))/ncol(tmp)),]
jstar
sumber
@ZheyuanLi Jika Anda tidak menyukai jawabannya, cukup berikan suara negatifnya. Mengedit jawaban untuk merekomendasikan penandaan BUKAN merupakan tindakan yang tepat. Tinggalkan komentar jika Anda merasa perlu.
Manfred Radlwimmer