R'deki Veri Türleri
R'deki her değer, küçük bir atomik tür kümesinden birine sahiptir. İşin neredeyse tamamını dördü yapar:
- double - ondalık sayılar:
3.14,-2,1e6. R'nin "numeric" ile kastettiği budur ve yazdığınız her sayının varsayılanıdır. - integer - tam olarak saklanan,
Lsonekiyle yazılan tam sayılar:42L. - character - tırnak içindeki metin:
"hello". - logical -
TRUEveFALSEdoğruluk değerleri (artı eksik değerNA- bkz. eksik değerler).
Ara sıra karşınıza çıkan sinyal işleme matematiği için bir de complex (2 + 3i) vardır; ona ihtiyaç duymadan yıllar geçirebilirsiniz. typeof() size bir değerin hangi türde olduğunu söyler:
İlk satıra dikkat: sade bir sayı, tam sayı gibi görünse bile bir double'dır. typeof(42) "double"'dır; yalnızca 42L bir integer'dır. Günlük analizde bu fark nadiren önemlidir - R aralarında sessizce dönüşüm yapar - ama typeof() çıktısındaki başka türlü kafa karıştırıcı pek çok şeyi açıklar.
typeof() ve class(): Neden Ayrışırlar
R'de ikisi de "bu nedir?" sorusunu yanıtlıyormuş gibi görünen iki fonksiyon vardır ve aslında ince biçimde farklı sorular yanıtlarlar.
typeof()saklama türünü bildirir: değerin bellekte nasıl durduğunu.class()davranış türünü bildirir: R'nin metot çağırırken, örneğin hangiprintveyasummaryçalışacağına karar vermek için kullandığı etiketi.
Basit değerlerde yanıtlar yalnızca sözcük olarak ayrışır:
typeof() double (saklama), class() ise numeric (davranış) der. Yapılarda arayı açılır:
Matris, düz bir integer vektörü olarak saklanır, ama bir matris gibi davranır - R'ye onu bir ızgara olarak yazdırmasını söyleyen şey class()'tır. Aynı ayrım veri çerçevelerinde (typeof "list" der, class "data.frame" der) ve tarihlerde (typeof "double" der, class "Date" der) de görülür.
Pratik kural: bir şeyin gündelik anlamda ne olduğunu öğrenmek istediğinizde class(), R'nin perde arkasında ne yaptığında hata ayıklarken typeof() kullanın.
is.*() ile Tür Kontrolü
Her türün, TRUE veya FALSE döndüren eşleşen bir yüklemi vardır - girdisini doğrulaması gereken fonksiyonların içinde kullanışlıdır:
Bilmeye değer bir tuzak: is.numeric(), hem double hem integer için TRUE'dur (ikisi de sayıdır), ama is.integer() saklamayı kontrol eder, dolayısıyla sade bir 42 için FALSE verir:
Matematiksel anlamda apaçık bir tam sayı olan bir değer için is.integer(7) sonucunun FALSE çıkmasına şaşırdıysanız - sebebi budur. 7 bir double'dır; 7L bir integer'dır.
as.*() ile Tür Dönüştürme
Açık dönüşüm, hedef tür başına bir fonksiyon içeren as.* ailesini kullanır:
Hatırlanması gereken iki davranış var. as.integer() yuvarlamak yerine sıfıra doğru kırpar - 7.9, 7 olur. Ve bir dönüşüm anlamsız olduğunda R hata fırlatmaz; NA döndürüp bir uyarı yayar:
Bunu çalıştırın; NA ile birlikte bir "NAs introduced by coercion" uyarısı görürsünüz. Bu gerçekten faydalıdır - dağınık metinden oluşan bütün bir sütunu sayıya çevirin, ayrıştırılamayan girdiler betiğinizi çökertmek yerine NA olur - ama aynı zamanda sessiz bir NA'nın verinize sızabileceği anlamına gelir. Bir dönüşüm önem taşıyorsa sonrasında yeni NA var mı diye bakın.
Mantıksal değerler, sayılara ve sayılardan umduğunuz gibi dönüşür: as.numeric(TRUE) 1'dir, as.logical(0) FALSE'tur. Bir logical vektörün sum() değerinin TRUE'ları saymasının nedeni budur:
Örtük Zorlama: Vektörler İçin Tek-Tür Kuralı
R'de atomik bir vektör yalnızca tek bir tür tutabilir. Karışık değerleri c() ile birleştirin; R sabit bir merdiveni izleyerek her şeyi mevcut en esnek türe sessizce yükseltir:
logical → integer → double → character
Mantıksal değerler 1 ve 0 oldu, integer'lar double'a dönüştü ve son satırda her şey metne dönüştü - character her zaman kazanır, çünkü herhangi bir değer bir metin olarak yazılabilir. typeof() ile doğrulayabilirsiniz:
Zorlama, "sütunum neden metin oldu?" hatalarının bir numaralı kaynağıdır: sayılardan oluşan bir sütunda başıboş tek bir "N/A" metni tüm vektörü character'a zorlar. Bu olduğunda önce sorunlu değeri düzeltin, sonra as.numeric() ile geri dönüştürün.
Buradan Ne Çıkarıyorsunuz
- Dört ana tür: double ("numeric"), integer (
42L), character, logical. typeof()= nasıl saklandığı;class()= nasıl davrandığı.3.14,numericgibi davranan birdouble'dır.is.numeric()ve arkadaşlarıyla kontrol edin;as.numeric()ve arkadaşlarıyla dönüştürün - başarısız dönüşümler hata değil, uyarıyla birlikteNAverir.- Vektörler yalnızca tek bir tür tutar; karıştırmak logical → integer → double → character sırasıyla zorlama yapar.
Sırada: sayısal türlere daha yakından bir bakış - yuvarlama, matematik fonksiyonları ve her dilin paylaştığı kayan nokta sürprizleri.
Sıkça Sorulan Sorular
R'deki temel veri türleri nelerdir?
Atomik türler şunlardır: double (ondalık sayılar, R'nin "numeric" dediği şey), integer (42L gibi L sonekiyle yazılan tam sayılar), character (tırnak içinde metin), logical (TRUE/FALSE) ve nadiren kullanılan complex. Daha büyük olan her şey - vektörler, veri çerçeveleri, listeler - bunlardan inşa edilir.
R'de typeof() ile class() arasındaki fark nedir?
typeof() bir değerin bellekte nasıl saklandığını (düşük düzeyli türünü) bildirir; class() ise değerin nasıl davrandığını bildirir ve R'nin hangi metodu çağıracağını bu belirler. Sade bir ondalık sayı için sözcük düzeyinde ayrışırlar - typeof(3.14) "double", class(3.14) ise "numeric"'tir - veri çerçevesi gibi yapılarda ise typeof() "list", class() "data.frame" der.
R'de türler nasıl dönüştürülür?
as.* ailesini kullanın: as.numeric("3.5") 3.5 verir, as.character(42) "42" verir, as.integer(7.9) ise 7'ye kırpar. Dönüşüm mümkün olmadığında R hata vermez, NA döndürüp uyarı üretir - as.numeric("abc") sonucu NA'dır.
R'de zorlama (coercion) nedir?
Tek bir vektörde farklı türleri birleştirdiğinizde R sessizce her şeyi en esnek türe dönüştürür; sıra şudur: logical → integer → double → character. Yani c(1, 2, "three") bir character vektörü olur: "1" "2" "three".