NA "Bilinmiyor" Demektir - ve Yayılır
Gerçek veri kümelerinde delikler vardır: boş bırakılan anket sorusu, bir ölçümü düşüren sensör. R her deliği NA ile temsil eder - not available. Kritik zihinsel model: NA sıfır değildir, boş metin değildir, özel bir sayı değildir. Şu anlama gelir: "burada bir değer var, ama ne olduğunu bilmiyoruz."
Bunu ciddiye alın; R'nin davranışı mantıklı hâle gelir. Bilinmeyen bir sayı artı bir kaçtır? Bilinmiyor. 4, 8 ve bilinmeyen bir şeyin ortalaması kaçtır? Bilinmiyor - eksik değer herhangi bir şey olabilir, dolayısıyla ortalama da herhangi bir şey olabilir:
Üçü de NA yazdırır. Bu bulaşıcılık bir hata değil, bir özelliktir: R bilmediği bir yanıtı bildiğini sessizce iddia etmeyi reddeder. Boşlukları sessizce atlayan bir hesap tablosu, bir sütunun yarısının eksik olduğunu gizleyebilir; R sizi fark etmeye ve eksik değerlerin analiziniz için ne anlama gelmesi gerektiğine karar vermeye zorlar. Bu yazının kalanı, o kararı bilinçli vermekle ilgilidir.
NA Testi: is.na(), Asla ==
İşte herkesin düştüğü ilk tuzak. Eksik değerleri bulmak istersiniz, bir karşılaştırma yazarsınız - ve işe yaramaz:
x == NA NA NA NA döndürür - tek bir TRUE bile yok. Neden? "Bilinmeyen" mantığını izleyin: 4, bilinmeyen bir değere eşit mi? Söylenemez - bilinmeyen 4 olabilir. NA yuvası bile NA olarak karşılaştırılır: bir bilinmeyen başka bir bilinmeyene eşit mi? Bilinmiyor. NA ile karşılaştırma asla TRUE ya da FALSE döndüremez, dolayısıyla bir test olarak işe yaramaz - dahası, [ ] içindeki tamamen NA'lı bir maske beklediğiniz şeyi seçmez.
Doğru araç, tam olarak bu soruyu yanıtlamak için yapılmış ve dürüst mantıksal değerler döndüren is.na() fonksiyonudur: FALSE TRUE FALSE. Buradan sürekli kullanacağınız iki deyim çıkar:
sum(is.na(x)) eksik değerleri sayar (TRUE, 1 olarak toplanır) - yeni bir veri kümesinin her sütununda her şeyden önce bunu çalıştırın. which(is.na(x)) onları konumlandırır. Ve x[!is.na(x)] yalnızca gözlenmiş değerleri tutar - mantıksal maskeyle elle silme, her zamanki vektör filtreleme kalıbı.
Özetlerde NA'yı Atlamak: na.rm = TRUE
NA'ları genellikle elle silmeniz gerekmez, çünkü R'nin özet fonksiyonlarında yerleşik bir kaçış kapağı vardır - na.rm (NA remove) argümanı:
na.rm = TRUE ile fonksiyon eksik değerleri atar ve kalan üzerinde hesaplar: 4 ile 8'in ortalaması 6'dır. sum(), sd(), median(), min(), max(), var() - betimleyici istatistik ailesinin tamamı bunu kabul eder.
Varsayılanın FALSE olduğuna dikkat edin. Bu, R'nin sizin lehinize taraf tutmasıdır: eksik veriyi yok saymanın sessiz bir varsayılan değil, yazdığınız açık bir seçim olmasını ister. na.rm = TRUE yazdığınızda "eksik değerleri burada yok saymak güvenli" iddiasında bulunursunuz - bir sensör rastgele birkaç ölçümü kaçırdığında bu doğru, ama diyelim ki en düşük gelirliler gelir sorusunu atladığında tehlikeli biçimde yanlıştır. Argüman, bu kararın sorumluluğunu size aldırır.
Eksik Satırları Düşürme: na.omit() ve complete.cases()
Bir veri çerçevesinde eksiklik hücrelerde yaşar, ama analiz genellikle satır satır çalışır - dolayısıyla yaygın işlem, herhangi bir NA içeren satırları düşürmektir:
na.omit(df), en az bir NA içeren her satırı çıkarılmış veri çerçevesini döndürür - burada yalnızca Rosa hayatta kalır. complete.cases(df), aynı fikrin arkasındaki mantıksal satır maskesini (TRUE FALSE FALSE) döndürür ve onunla indekslemek aynı sonuçları iki avantajla verir: neyi kaybetmek üzere olduğunuzu önce sayabilirsiniz (sum(!complete.cases(df))) ve hangi sütunların önemli olduğunu sınırlayabilirsiniz - df[complete.cases(df[, "age"]), ] yalnızca age değeri eksik satırları düşürür ve puanı bilinmemesine rağmen Mia'yı tutar.
O sütun-sınırlı biçim, göründüğünden daha önemlidir: geniş bir veri çerçevesinde na.omit(), analiz etmeyi hiç planlamadığınız sütunlardaki NA'lar yüzünden satırlarınızın çoğunu sessizce atabilir. Düşürmeden önce kaç satır düşürdüğünüzü ve nedenini bilin.
NA'yı Değiştirmek
Bazen doğru hamle, satırları silmek yerine delikleri doldurmaktır. Deyim, is.na() ile atamayı birleştirir:
Şöyle okuyun: "visits değerinin eksik olduğu yuvalara 0 koy." Bu, tam olarak NA'nın bilinen bir değeri kodladığı durumlarda meşrudur - ziyaret kaydı olmayan bir müşteri gerçekten sıfır ziyaret yapmıştır.
Ama bunun ne zaman doğru olduğu konusunda dürüst olun. NA "ölçmeyi başaramadık" anlamına geliyorsa 0 koymak veri uydurmaktır: eksik sınav puanlarını 0 ile değiştirmek, o öğrenciler sıfır almış gibi ortalamayı aşağı çeker; oysa gerçekte ne aldıklarını bilmiyorsunuz. Yukarıdaki ortalamayı (2.4) orijinalin na.rm ortalamasıyla (4) karşılaştırın: aynı veri, farklı iddialar. Ortalama ya da medyanla değiştirmek daha az bozar ama yine de değişkenliği olduğundan az gösterir. Kural: bir değeri, ancak o değerin eksik girdinin gerçekte ne olduğu olduğunu sade sözcüklerle söyleyebiliyorsanız atfedin. Aksi hâlde NA'yı koruyun ve na.rm kullanın - "bilinmiyor", çoğu zaman veri kümesindeki en doğru değerdir.
NA, NULL, NaN ve Inf
R'de gerçekten farklı şeyler ifade eden, birbirine benzeyen dört özel değer vardır:
| Değer | Anlamı | Uzunluk | Tipik kaynak |
|---|---|---|---|
NA | Bir değer var ama bilinmiyor | 1 (bir yuva doldurur) | Eksik veri |
NULL | Hiç nesne yok | 0 (yuva yok) | Silinen liste elemanı, boş sonuç |
NaN | Tanımsız yanıtlı matematik | 1 | 0 / 0, log(-1) |
Inf | Temsil edilebilirliğin ötesinde sayı | 1 | 1 / 0, taşma |
Pratikte önemli olan ayrımlar: NULL vektörlerin içinde kaybolur (c(1, NULL, 3) iki eleman içerir - eksik bir gözlemi temsil edemez), NA ise yerini korur. NaN eksik sayılır (is.na(NaN) TRUE'dur, dolayısıyla na.rm onu da siler), ama tersi doğru değildir - is.nan(NA) FALSE'tur. Ve Inf eksik değildir - gerçek, karşılaştırılabilir bir sayıdır (Inf > 1e300 TRUE'dur), dolayısıyla na.rm onu silmez; sıradan sayılara filtrelemek için is.finite() kullanın.
Tamlık için: NA sessizce türlü çeşitleriyle gelir (NA_integer_, NA_real_, NA_character_), böylece tek-tür kuralını bozmadan herhangi bir vektörde durabilir. Bunları nadiren yazarsınız, ama paket kodunda ve dplyr hata mesajlarında görürsünüz.
Buradan Ne Çıkarıyorsunuz
NA"bilinmiyor" demektir ve bilinmeyenler bulaşıcıdır: NA'ya dokunan her hesaplama NA döndürür - tasarım gereği.is.na()ile test edin, asla== NAile değil; deliklerisum(is.na(x))ile sayın.na.rm = TRUE, özet fonksiyonlarının NA'ları atlamasını sağlar - eksik değerlerin göz ardı edilebilir olduğuna dair açık, çağrı bazlı bir karar.na.omit()eksik satırları toptan düşürür;complete.cases()size sayılabilir ve önemli sütunlarla sınırlanabilir maskeyi verir.- NA'yı (
x[is.na(x)] <- value) yalnızca eksik değerin gerçekte ne olduğunu gerekçelendirebiliyorsanız değiştirin. - NA ≠ NULL ≠ NaN ≠ Inf: eksik değer, olmayan nesne, tanımsız matematik, sınırsız sayı.
Sırada: fonksiyonlar - mantığınızı yeniden kullanılabilir, isimli parçalara paketlemek.
Sıkça Sorulan Sorular
R'de mean() neden NA döndürüyor?
Çünkü vektördeki en az bir değer NA'dır ve NA bulaşıcıdır: girdilerden biri bilinmiyorsa R yanıtın da bilinmediğini söyler. Mevcut değerlerin ortalamasını hesaplamak için na.rm = TRUE geçirin - mean(x, na.rm = TRUE). Çoğu özet fonksiyonu (sum, sd, median, min, max) aynı argümanı kabul eder.
R'de NA nasıl kontrol edilir?
Bir değer eksik olduğu her yerde TRUE döndüren is.na(x) ile. Asla x == NA ile test etmeyin - bir şeyi bilinmeyenle karşılaştırmak TRUE ya da FALSE değil NA verir, dolayısıyla test sessizce başarısız olur. sum(is.na(x)) eksik değerleri sayar; which(is.na(x)) konumlarını bulur.
R'de bir veri çerçevesinden NA içeren satırlar nasıl silinir?
na.omit(df), en az bir NA içeren her satırı düşürür. Daha fazla denetim için complete.cases(df), tam gözlenmiş satırları işaretleyen bir logical vektör döndürür; böylece df[complete.cases(df), ] aynı işi açıkça yapar - ve bunu yalnızca önemli sütunlara uygulayabilirsiniz, ör. df[complete.cases(df[, c("age", "score")]), ].
R'de NA ile NULL arasındaki fark nedir?
NA eksik bir değerdir - bir vektörde bir yer kaplar ve uzunluğu 1'dir. NULL ise bir nesnenin yokluğudur - uzunluğu 0'dır ve bir vektöre konduğunda kaybolur: c(1, NULL, 3) yalnızca iki eleman içerir. Eksik bir veri noktası için NA kullanın; NULL, liste elemanlarını silerken ya da boş bir dönüş değeri olarak görünür.