Veri çerçevesinin seçilen bir sütununda NA (eksik) değerleri içeren satırların alt kümesi


97

CSV dosyasından bir veri çerçevemiz var. Veri çerçevesi DF, gözlemlenen değerleri içeren sütunlara ve VaR2ölçümün yapıldığı tarihi içeren bir sütuna ( ) sahiptir. Tarih kaydedilmediyse, CSV dosyası NAeksik veriler için değeri içerir .

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

new_DFYalnızca NA'column ( VaR2) değerine sahip satırları içerecek şekilde yeni bir veri çerçevesi tanımlamak için subset komutunu kullanmak istiyoruz . Verilen örnekte, yenide yalnızca 2. Satır yer alacaktır DF.

Komuta

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

çalışmazsa, elde edilen veri çerçevesinin satır girişi yoktur.

Orijinal CSV dosyasındaki değer ise NAile değiş tokuş edilir NULL, aynı komut istenilen sonucu üretir: new_DF<-subset(DF,DF$Var2=="NULL").

Karakter dizesi için değer NAorijinal CSV dosyasında sağlanmışsa , bu yöntemi nasıl çalıştırabilirim ?

Yanıtlar:


151

Eksik değerleri test etmek için asla == 'NA' kullanmayın. is.na()Bunun yerine kullanın . Bunu yapmalı:

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

veya belirli bir sütunu kontrol etmek istemeniz durumunda, şunu da kullanabilirsiniz:

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

NA karakter değerlerine sahipseniz, önce çalıştırın

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

bunları eksik değerlerle değiştirmek için.


2
Hızlı cevabınız için teşekkürler (bu hızlıydı)! Gerçekten de, verilerin csv teslimatı nedeniyle, 'NA' karakter değerleridir ve ikinci ifadeniz çok yararlı olabilir. İlk ifadenizi de açıklayabilir misiniz? RowSums () 'un kullanımı benim için net değil, çünkü sadece belirli bir sütunu kontrol edeceğim (çok sayıda sütun var). Söz konusu sütunda (örnekte bu sütun Var2 olacaktır) bir 'NA' karakter dizesi varsa (onu ikinci ifadenizle değiştireceğim), o zaman tüm satırı yeni veri çerçevesinin bir parçası olacak şekilde seçmek istiyorum .
John

@John: güncellendi. Buradaki nokta is.na'yı kullanmak, tüm değişkenleri kontrol etmek istediğini yanlış yorumladım.
Joris Meys

3
bu olmalı new_DF <- DF[is.na(DF$Var),], yani (sonrasında fazladan bir parantez var DF[mı?
PatrickT

39

NA, R'de özel bir değerdir, NA değerini "NA" dizesiyle karıştırmayın. Verilerin içe aktarılma şekline bağlı olarak, "NA" ve "NULL" hücreleriniz çeşitli türlerde olabilir (varsayılan davranış, "NA" dizelerini NA değerlerine dönüştürmek ve "NULL" dizeleri olduğu gibi bırakmaktır).

Read.table () veya read.csv () kullanıyorsanız, temiz veri içe aktarımı yapmak için "na.strings" argümanını göz önünde bulundurmanız ve her zaman gerçek R NA değerleriyle çalışmanız gerekir.

Her iki durumda da "NULL" ve "NA" hücrelerinde çalışan bir örnek:

DF <- read.csv("file.csv", na.strings=c("NA", "NULL"))
new_DF <- subset(DF, is.na(DF$Var2))

1
Cevabınız için teşekkürler. Doğru anlarsam, ilk ifade Joris örneğindeki Df [Df == 'NA'] <- NA ile aynı şeyi yapacaktır? Bu durumda (küçük) fark, ifadenizde doğrudan veri çerçevesi oluşturulduğunda, başlangıçta yapılmasıdır (bu çok temiz bir programlama yöntemidir ve bu nedenle hoşuma gidiyor).
John

Kesinlikle. Joris "NA" dizelerini NA değerleriyle manuel olarak değiştirmeyi önerdi, burada sadece aynı amaca ulaşmak için read.table () 'ın "na.strings" özelliğini kullanmanızı öneriyorum.
maressyl

Joris'in cevabı aslında bu başarıyı elde etmenin "tercih edilen" yoludur (eğer bunu bir senaryoda yazıyorsanız). Bakınız: stackoverflow.com/questions/9860090/…
Jonathan

@Jonathan: Burada iki farklı fikir, alıntı yaptığınız konu "alt küme" için tercih edilmeli diyor, ancak read.table () içindeki "na.strings" argümanından bahsediyorduk, alt kümem sadece görselleştirmek için buradaydı efektler.
maressyl

35

complete.casesveren TRUEbir satırda tüm değerler olmadığındaNA

DF[!complete.cases(DF), ]

13
new_data <- data %>% filter_all(any_vars(is.na(.))) 

Bu new_data, yalnızca içindeki eksik değerlerle yeni bir veri çerçevesi ( ) oluşturmalıdır .

Eksik gözlemler içeren (NA) bazı sütunlara sahip olduklarından, daha sonra bırakabileceğiniz değerlerin kaydını tutmak için en iyi sonucu verir.


3

Bunu değiştirmeyi deneyin:

new_DF<-dplyr::filter(DF,is.na(Var2)) 

Bunun neden işe yaradığını, ne işe yaradığını vb. Açıklar mısınız?
csilk

new_DF <-dplyr :: filter (DF, is.na (Var2)) temelde dplyr paketinin filtre fonksiyonunu kullanır ve Var2 sütunundaki is.na koşulunu sağlayan herhangi bir gözlemi filtreler, yani NA ile tüm gözlemleri seçerler
drhnis

1
Daha güzel bir şekilde DF %>% filter(is.na(Var2))sonradan ifade edildi library(dplyr).
Joe

-1

NA verileriyle tüm satırları yazdırır:

tmp <- data.frame(c(1,2,3),c(4,NA,5));
tmp[round(which(is.na(tmp))/ncol(tmp)),]

@ZheyuanLi Cevabı beğenmediyseniz, aşağı oy verin. Yanıtı işaretlemeyi tavsiye edecek şekilde düzenlemek uygun bir eylem DEĞİLDİR. Gerekirse bir yorum bırakın.
Manfred Radlwimmer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.