Jaka jest różnica między klasą liczb całkowitych a klasą numeryczną w języku R.


96

Chciałbym rozpocząć od stwierdzenia, że ​​jestem absolutnie początkującym programistą, więc proszę wybacz, jak podstawowe jest to pytanie.

Próbuję lepiej zrozumieć „atomowe” klasy w R i być może dotyczy to ogólnie zajęć z programowania. Rozumiem różnicę między klasami znakowymi, logicznymi i złożonymi klasami danych, ale staram się znaleźć podstawową różnicę między klasą liczbową a klasą liczb całkowitych.

Powiedzmy, że mam prosty wektor x <- c(4, 5, 6, 6)liczb całkowitych, sensowne byłoby, gdyby była to klasa liczb całkowitych. Ale kiedy class(x)dostanę [1] "numeric". Następnie, jeśli przekonwertuję ten wektor na klasę liczb całkowitychx <- as.integer(x) . Zwraca tę samą dokładną listę liczb, ale klasa jest inna.

Moje pytanie brzmi: dlaczego tak jest i dlaczego domyślną klasą zbioru liczb całkowitych jest klasa numeryczna oraz jakie są zalety i wady posiadania liczby całkowitej ustawionej jako numeryczna zamiast całkowitej.


4
Czy as.integer(c(4.1, 5.2, 6.3, 6.4))pomaga zrozumieć różnicę? Musisz zrozumieć, że wewnętrzna reprezentacja i to, co jest drukowane, wcale nie są takie same. W każdym razie poczytaj o typach danych w językach komputerowych.
Roland

W kolumnie „Powiązane” po prawej stronie jest to pytanie: stackoverflow.com/questions/8804779/…
Matthew Lundberg

1
Spróbuj x <- 1; is.integer(x); is.numeric(x)więc, x <- 1L; is.integer(x); is.numeric(x)a możesz dostrzec niewielką różnicę. Klasy całkowite są używane częściej do przekazywania zmiennych z konstrukcji C, a także w strukturach R. Chociaż jest o wiele więcej w tym.
Rich Scriven

@Roland Nie myślałem o klasach określających precyzję. Jestem przyzwyczajony do używania metod typu float w celu manipulowania klasami całkowitymi. To ma sens.
Keon

Odpowiedzi:


87

Istnieje wiele klas, które są zgrupowane razem jako klasy „numeryczne”, z których 2 najczęściej spotykane to podwójne (dla liczb zmiennoprzecinkowych o podwójnej precyzji) i liczby całkowite. R automatycznie konwertuje między klasami numerycznymi w razie potrzeby, więc w większości przypadków dla zwykłego użytkownika nie ma znaczenia, czy liczba 3 jest obecnie przechowywana jako liczba całkowita czy podwójna. Większość matematyki jest wykonywana z podwójną precyzją, więc często jest to domyślna pamięć.

Czasami możesz chcieć specjalnie zapisać wektor jako liczby całkowite, jeśli wiesz, że nigdy nie zostaną one zamienione na liczby podwójne (używane jako wartości identyfikacyjne lub indeksowanie), ponieważ liczby całkowite wymagają mniej miejsca w pamięci. Ale jeśli mają zostać użyte w jakiejkolwiek matematyce, która zamieni je na podwojenie, to prawdopodobnie najszybciej będzie po prostu zapisać je jako podwójne.


47

Po pierwsze, używanie R z powodzeniem przez lata jest całkowicie wykonalne i nie trzeba znać odpowiedzi na to pytanie. R obsługuje w tle różnice między (zwykłymi) liczbami a liczbami całkowitymi.

> is.numeric(1)

[1] TRUE

> is.integer(1)

[1] FALSE

> is.numeric(1L)

[1] TRUE

> is.integer(1L)

[1] TRUE

(Umieszczenie dużej litery „L” po liczbie całkowitej wymusza zapisanie jej jako liczby całkowitej).

Jak widać, „liczba całkowita” jest podzbiorem „liczbowych”.

> .Machine$integer.max

[1] 2147483647

> .Machine$double.xmax

[1] 1.797693e+308

Liczby całkowite dochodzą do nieco ponad 2 miliardy, podczas gdy inne liczby mogą być znacznie większe. Mogą być większe, ponieważ są przechowywane jako liczby zmiennoprzecinkowe o podwójnej precyzji. Oznacza to, że liczba jest przechowywana w dwóch częściach: wykładniku (jak 308 powyżej, z wyjątkiem podstawy 2 zamiast podstawy 10) i „sztyftu” (jak powyżej 1.797693).

Zauważ, że „is.integer” nie jest testem tego, czy masz liczbę całkowitą, ale testem sposobu przechowywania danych.

Należy zwrócić uwagę na to, że operator dwukropka,, :zwróci liczby całkowite, jeśli punkt początkowy i końcowy są liczbami całkowitymi. Na przykład 1:5tworzy integerwektor liczb od 1 do 5. Nie musisz dodawać litery L.

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

Źródła: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R


11
Zrobione dokładnie z postu Quora, prawda? Mogłeś właśnie wspomnieć o referencji!
Srujan Barai


4

Cytując stronę pomocy (spróbuj ?integer), moja pogrubiona część:

Istnieją wektory całkowite, dzięki czemu dane mogą być przekazywane do kodu C lub Fortran, który ich oczekuje, a (małe) dane całkowite mogą być reprezentowane dokładnie i zwięźle .

Zauważ, że obecne implementacje języka R używają 32-bitowych liczb całkowitych dla wektorów całkowitych, więc zakres reprezentowalnych liczb całkowitych jest ograniczony do około +/- 2 * 10 ^ 9: liczby podwójne mogą zawierać dokładnie znacznie większe liczby całkowite.

Jak mówi strona pomocy, R. integer są 32-bitowymi liczbami ze znakiem, więc mogą zawierać od -2147483648 do +2147483647 i zajmować 4 bajty.

R numericjest identyczny z 64-bitowym, doublezgodnym ze standardem IEEE 754. R nie ma typu danych o pojedynczej precyzji. (źródło: strony pomocy numerici double). Double może przechowywać wszystkie liczby całkowite od -2 ^ 53 do 2 ^ 53 bez utraty precyzji.

Możemy zobaczyć rozmiary typów danych, w tym narzut wektora ( źródło ):

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

1

W moim rozumieniu - nie deklarujemy zmiennej o typie danych, więc domyślnie R ustawił dowolną liczbę bez L jako liczbę. Jeśli napisałeś:

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

Przykład liczby całkowitej:

> x<- 2L
> print(x)

Przykład liczbowy (coś w rodzaju double / float z innych języków programowania)

> x<-3.4
> print(x)

uważaj na zakres, taki jak 1:5utworzy liczby całkowite.
qwr
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.