R'deki tamsayı sınıfı ile sayısal sınıf arasındaki fark nedir


96

Programlamaya mutlak bir acemi olduğumu söyleyerek bunun önsözünü yapmak istiyorum, bu yüzden lütfen bu sorunun ne kadar basit olduğunu mazur görün.

R'deki "atomik" sınıfları daha iyi anlamaya çalışıyorum ve belki bu genel olarak programlama dersleri için geçerli. Bir karakter, mantıksal ve karmaşık veri sınıfları arasındaki farkı anlıyorum, ancak sayısal bir sınıf ile bir tamsayı sınıfı arasındaki temel farkı bulmakta zorlanıyorum.

Diyelim ki basit bir x <- c(4, 5, 6, 6)tamsayı vektörüm var , bunun bir tamsayı sınıfı olması mantıklı olacaktır. Ama ne zaman yaparsam class(x)anlarım [1] "numeric". Sonra bu vektörü bir tamsayı sınıfına dönüştürürsem x <- as.integer(x). Sınıfın farklı olması dışında aynı sayı listesini döndürür.

Sorum şu: Neden böyle bir durum ve neden bir tamsayılar kümesi için varsayılan sınıf bir sayısal sınıf ve tamsayı yerine sayısal olarak ayarlanmış bir tam sayıya sahip olmanın avantajları ve / veya dezavantajları nelerdir?


4
as.integer(c(4.1, 5.2, 6.3, 6.4))Farkı anlamanıza yardımcı oluyor mu ? İç temsil ile basılı olanın hiç aynı olmadığını anlamalısınız. Her neyse, bilgisayar dillerindeki veri türleri hakkında biraz okuma yapın.
Roland

Sağdaki "İlgili" sütununda şu soru var: stackoverflow.com/questions/8804779/…
Matthew Lundberg

1
Deneyin x <- 1; is.integer(x); is.numeric(x), o zaman x <- 1L; is.integer(x); is.numeric(x)farkı biraz görebilirsiniz. Tamsayı sınıfları daha çok C yapılarından ve ayrıca R yapılarında değişkenleri geçirmek için kullanılır. Yine de, bundan çok daha fazlası var.
Rich Scriven

@Roland Hassasiyet belirten sınıfları düşünmedim. Tamsayı sınıflarını işlemek için float yöntemlerini kullanmaya alışkınım. Mantıklı.
Keon

Yanıtlar:


87

"Sayısal" sınıflar olarak gruplandırılmış birden çok sınıf vardır, bunlardan en yaygın olanı çift (çift duyarlıklı kayan noktalı sayılar için) ve tamsayıdır. R, gerektiğinde otomatik olarak sayısal sınıflar arasında dönüşüm yapacaktır, bu nedenle, 3 sayısının şu anda bir tamsayı olarak mı yoksa bir çift olarak mı depolandığının, çoğunlukla sıradan kullanıcı için önemi yoktur. Çoğu matematik, çift kesinlik kullanılarak yapılır, bu nedenle bu genellikle varsayılan depolamadır.

Bazen, tamsayılar daha az depolama alanı gerektirdiğinden, bunların hiçbir zaman çiftlere dönüştürülmeyeceğini biliyorsanız (kimlik değerleri veya indeksleme olarak kullanılır) bir vektörü özellikle tamsayı olarak saklamak isteyebilirsiniz. Ama eğer onları ikiye katlayacak herhangi bir matematikte kullanılacaksa, o zaman başlangıçta ikiye katlamak muhtemelen en hızlısı olacaktır.


47

Öncelikle, R'yi yıllarca başarılı bir şekilde kullanmak tamamen mümkündür ve bu sorunun cevabını bilmenize gerek yoktur. R, arka planda sizin için (normal) sayısallar ve tam sayılar arasındaki farkları ele alır.

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(Bir tamsayıdan sonra büyük 'L' koymak, onu tam sayı olarak depolanmaya zorlar.)

Gördüğünüz gibi "tamsayı", "sayısal" ın bir alt kümesidir.

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

Tamsayılar sadece 2 milyardan biraz fazla olabilirken, diğer sayısallar çok daha büyük olabilir. Çift duyarlıklı kayan nokta numaraları olarak saklandıkları için daha büyük olabilirler. Bu, sayının iki parça halinde saklandığı anlamına gelir: üs (yukarıdaki 308 gibi, 10 tabanı yerine 2 tabanı hariç) ve "anlamlı ve" (yukarıdaki 1.797693 gibi).

'İs.integer' ifadesinin bir tam sayıya sahip olup olmadığınızı değil, verilerin nasıl depolandığını gösteren bir test olduğunu unutmayın.

Dikkat edilmesi gereken bir nokta, iki nokta üst üste operatörünün, :başlangıç ​​ve bitiş noktaları tam sayılarsa tamsayılar döndürecektir. Örneğin, 1'den 5'e kadar sayılardan oluşan 1:5bir integervektör oluşturur L. Harfi eklemenize gerek yoktur .

> class(1:5)
[1] "integer"

Referans: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R


11
Tam olarak Quora postasından alınmış değil mi? Referanstan bahsedebilirdin!
Srujan Barai


4

Yardım sayfasından alıntı yapmak için (deneyin ?integer), kalın olan kısım benim:

Tamsayı vektörleri, verilerin onları bekleyen C veya Fortran koduna geçirilebilmesi ve böylece (küçük) tam sayı verilerin tam ve kompakt bir şekilde temsil edilebilmesi için mevcuttur. .

Mevcut R uygulamalarının tamsayı vektörleri için 32 bitlik tamsayılar kullandığına dikkat edin, bu nedenle gösterilebilir tamsayı aralığı yaklaşık +/- 2 * 10 ^ 9 ile sınırlıdır: çiftler tam olarak çok daha büyük tam sayıları tutabilir.

Yardım sayfasının dediği gibi, integerR'ler 32 bitlik sayılarla işaretlenmiştir, böylece -2147483648 ile +2147483647 arasında tutabilir ve 4 bayt alabilir.

R'ın numericbir 64 bit ile aynıdır double, IEEE 754 standardına uygun. R'nin tek bir kesinlik veri türü yoktur. (kaynak: yardım sayfalarını numericve double). Bir çift, -2 ^ 53 ile 2 ^ 53 arasındaki tüm tam sayıları kesinlik kaybı olmadan tam olarak saklayabilir.

Bir vektörün ( kaynak ) ek yükü de dahil olmak üzere veri türü boyutlarını görebiliriz :

> object.size(1:1000)
4040 bytes
> object.size(as.numeric(1:1000))
8040 bytes

1

Anladığım kadarıyla - bir veri türüne sahip bir değişken bildirmiyoruz, bu nedenle varsayılan olarak R, L'siz herhangi bir sayıyı sayısal olarak ayarlamıştır. Yazdıysanız:

> x <- c(4L, 5L, 6L, 6L)
> class(x)
>"integer" #it would be correct

Tamsayı Örneği:

> x<- 2L
> print(x)

Numeric Örneği (diğer programlama dillerinden benzer bir tür double / float)

> x<-3.4
> print(x)

1:5tamsayı oluşturacak gibi bir aralığa dikkat edin .
qwr
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.