Apa perbedaan antara kelas integer dan kelas numerik di R


96

Saya ingin mengawali ini dengan mengatakan saya seorang pemula pemrograman absolut, jadi mohon maaf betapa mendasar pertanyaan ini.

Saya mencoba untuk mendapatkan pemahaman yang lebih baik tentang kelas "atom" di R dan mungkin ini berlaku untuk kelas dalam pemrograman secara umum. Saya memahami perbedaan antara kelas data karakter, logika, dan kompleks, tetapi saya berjuang untuk menemukan perbedaan mendasar antara kelas numerik dan kelas integer.

Katakanlah saya memiliki vektor x <- c(4, 5, 6, 6)bilangan bulat sederhana , ini akan masuk akal untuk ini menjadi kelas integer. Tapi ketika saya melakukannya class(x)saya mendapatkan [1] "numeric". Kemudian jika saya mengubah vektor ini menjadi kelas integer x <- as.integer(x). Ini mengembalikan daftar angka yang sama persis kecuali kelasnya berbeda.

Pertanyaan saya adalah mengapa hal ini terjadi, dan mengapa kelas default untuk satu set bilangan bulat adalah kelas numerik, dan apa keuntungan dan atau kerugian memiliki set bilangan bulat sebagai numerik bukan bilangan bulat.


4
Apakah as.integer(c(4.1, 5.2, 6.3, 6.4))membantu Anda memahami perbedaannya? Perlu Anda pahami bahwa representasi internal dan apa yang dicetak sama sekali tidak sama. Bagaimanapun, bacalah beberapa jenis data dalam bahasa komputer.
Roland

Di kolom "Terkait" di sebelah kanan adalah pertanyaan ini: stackoverflow.com/questions/8804779/…
Matthew Lundberg

1
Cobalah x <- 1; is.integer(x); is.numeric(x), kemudian x <- 1L; is.integer(x); is.numeric(x)dan Anda mungkin dapat melihat sedikit perbedaannya. Kelas integer lebih banyak digunakan untuk melewatkan variabel dari konstruksi C dan juga dalam struktur R. Padahal, ada lebih banyak hal ini.
Rich Scriven

@Roland Saya tidak berpikir tentang kelas yang menentukan presisi. Saya terbiasa menggunakan metode float untuk memanipulasi kelas integer. Masuk akal.
Keon

Jawaban:


87

Ada beberapa kelas yang dikelompokkan bersama sebagai kelas "numerik", 2 yang paling umum adalah kelas ganda (untuk bilangan floating point presisi ganda) dan bilangan bulat. R secara otomatis akan mengkonversi antara kelas numerik bila diperlukan, jadi untuk sebagian besar tidak masalah bagi pengguna biasa apakah angka 3 saat ini disimpan sebagai integer atau sebagai double. Sebagian besar matematika dilakukan dengan menggunakan presisi ganda, sehingga sering kali menjadi penyimpanan default.

Terkadang Anda mungkin ingin secara khusus menyimpan vektor sebagai bilangan bulat jika Anda tahu bahwa vektor tersebut tidak akan pernah dikonversi menjadi ganda (digunakan sebagai nilai ID atau pengindeksan) karena bilangan bulat memerlukan lebih sedikit ruang penyimpanan. Tetapi jika mereka akan digunakan dalam matematika apa pun yang akan mengubahnya menjadi dua kali lipat, maka mungkin akan paling cepat untuk menyimpannya sebagai ganda untuk memulai.


47

Pertama, sangat mungkin untuk menggunakan R dengan sukses selama bertahun-tahun dan tidak perlu mengetahui jawaban atas pertanyaan ini. R menangani perbedaan antara angka (biasa) dan bilangan bulat untuk Anda di latar belakang.

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(Menempatkan kapital 'L' setelah bilangan bulat memaksanya untuk disimpan sebagai bilangan bulat.)

Seperti yang Anda lihat, "integer" adalah bagian dari "numerik".

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

Bilangan bulat hanya menghasilkan sedikit lebih dari 2 miliar, sedangkan angka lainnya bisa jauh lebih besar. Mereka bisa lebih besar karena disimpan sebagai angka floating point presisi ganda. Ini berarti bahwa nomor tersebut disimpan dalam dua bagian: eksponen (seperti 308 di atas, kecuali di basis 2 daripada basis 10), dan "signifikan" (seperti 1.797693 di atas).

Perhatikan bahwa 'is.integer' bukanlah tes apakah Anda memiliki bilangan bulat, tetapi tes bagaimana data disimpan.

Satu hal yang harus diperhatikan adalah bahwa operator titik dua :,, akan mengembalikan bilangan bulat jika titik awal dan akhir adalah bilangan bulat. Misalnya, 1:5membuat integervektor angka dari 1 sampai 5. Anda tidak perlu menambahkan hurufnya L.

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

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


11
Diambil persis dari pos Quora, Benar? Anda bisa saja menyebutkan referensi!
Srujan Barai


4

Untuk mengutip halaman bantuan (coba ?integer), bagian saya yang dicetak tebal:

Vektor bilangan bulat ada sehingga data dapat diteruskan ke kode C atau Fortran yang diharapkan, dan agar data bilangan bulat (kecil) dapat direpresentasikan dengan tepat dan kompak .

Perhatikan bahwa implementasi R saat ini menggunakan bilangan bulat 32-bit untuk vektor bilangan bulat, sehingga kisaran bilangan bulat yang dapat direpresentasikan dibatasi hingga sekitar +/- 2 * 10 ^ 9: ganda dapat menampung bilangan bulat yang jauh lebih besar secara tepat.

Seperti yang dikatakan halaman bantuan, R integerbertanda 32-bit sehingga dapat menampung antara -2147483648 dan +2147483647 dan memakan waktu 4 byte.

R numericidentik dengan 64-bit yang doublesesuai dengan standar IEEE 754. R tidak memiliki tipe data presisi tunggal. (sumber: halaman bantuan numericdan double). Ganda dapat menyimpan semua bilangan bulat antara -2 ^ 53 dan 2 ^ 53 tepat tanpa kehilangan presisi.

Kita dapat melihat ukuran tipe data, termasuk overhead vektor ( sumber ):

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

1

Menurut pemahaman saya - kami tidak mendeklarasikan variabel dengan tipe data jadi secara default R telah menetapkan angka apa pun tanpa L menjadi numerik. Jika Anda menulis:

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

Contoh Integer:

> x<- 2L
> print(x)

Contoh Numerik (sejenis like double / float dari bahasa pemrograman lain)

> x<-3.4
> print(x)

hati-hati rentang seperti 1:5akan membuat bilangan bulat.
qwr
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.