В чем разница между целочисленным классом и числовым классом в R
Я хочу предварить это, сказав, что я абсолютный новичок в программировании, поэтому, пожалуйста, извините, насколько прост этот вопрос.
Я пытаюсь лучше понять" атомарные " классы в R и, возможно, это относится к классам программирования в целом. Я понимаю разницу между символьными, логическими и сложными классами данных, но я изо всех сил пытаюсь найти фундаментальное различие между числовым классом и целочисленным классом.
допустим, у меня есть простой вектор x <- c(4, 5, 6, 6)
целых чисел, это имело бы смысл для этого, чтобы быть целым классом. Но когда я это делаю class(x)
Я [1] "numeric"
. Тогда, если я преобразую этот вектор в целочисленный класс x <- as.integer(x)
. Он возвращает тот же самый точный список чисел, за исключением того, что класс отличается.
мой вопрос заключается в том, почему это так, и почему класс по умолчанию для набора целых чисел является числовым классом, и каковы преимущества и недостатки того, что целое число установлено как числовое вместо целого.
2 ответа:
есть несколько классов, которые сгруппированы вместе как "числовые" классы, 2 наиболее распространенных из которых являются double (для чисел с плавающей запятой двойной точности) и integer. R будет автоматически преобразовываться между числовыми классами, когда это необходимо, поэтому для случайного пользователя по большей части не имеет значения, хранится ли число 3 в настоящее время как целое число или как двойное. Большая часть математики выполняется с использованием двойной точности, так что это часто хранилище по умолчанию.
иногда может потребоваться специально хранить вектор как целые числа, если вы знаете, что они никогда не будут преобразованы в двойники (используемые в качестве значений идентификаторов или индексирования), поскольку целые числа требуют меньше места для хранения. Но если они будут использоваться в любой математике, которая преобразует их в double, то, вероятно, будет быстрее всего хранить их как Double для начала.
во-первых, вполне возможно использовать R успешно в течение многих лет и не нужно знать ответ на этот вопрос. R обрабатывает различия между (обычными) числами и целыми числами для вас в фоновом режиме.
> is.numeric(1) [1] TRUE > is.integer(1) [1] FALSE > is.numeric(1L) [1] TRUE > is.integer(1L) [1] TRUE
(ввод заглавной буквы ' L ' после целого числа заставляет его храниться как целое число.)
как вы можете видеть, " integer "является подмножеством"numeric".
> .Machine$integer.max [1] 2147483647 > .Machine$double.xmax [1] 1.797693e+308
целые числа идут только немного больше, чем 2 миллиарда, в то время как другие цифры может быть намного больше. Они могут быть больше, потому что они хранятся в виде чисел с плавающей запятой двойной точности. Это означает, что число хранится в двух частях: экспоненте (например, 308 выше, за исключением базы 2, а не базы 10) и "значащем" (например, 1.797693 выше).
обратите внимание, что 'это.integer ' - это не проверка того, есть ли у вас целое число, а проверка того, как хранятся данные.
одна вещь, чтобы следить за тем, что оператор двоеточия,
:
, вернется целые числа, если начальная и конечная точки являются целыми числами. Например,1:5
создаетinteger
вектор чисел от 1 до 5. Вам не нужно добавлять буквуL
.> class(1:5) [1] "integer"
ссылка: https://www.quora.com/What-is-the-difference-between-numeric-and-integer-in-R