Почему R не может обрабатывать неравенства между отрицательными числами в кавычках
Это странная проблема с простым обходным путем, но мне просто любопытно, почему R ведет себя так.
> "-1"<"-2"
[1] TRUE
> -1<"-2"
[1] TRUE
> "-1"< -2
[1] TRUE
> -1< -2
[1] FALSE
> as.numeric("-1")<"-2"
[1] TRUE
> "-1"<as.numeric("-2")
[1] TRUE
> as.numeric("-1")<as.numeric("-2")
[1] FALSE
Что происходит? Пожалуйста, для моего здравомыслия...
2 ответа
"Число в кавычках" - это вовсе не число, а строка символов. Эти символы отображаются с тем же рисунком на экране, что и соответствующий номер, но они принципиально не являются одним и тем же объектом.
Поведение, которое вы видите, соответствует следующему:
- Пара чисел (
numeric
в R) сравнивается так, как и следовало ожидать, численно с естественным порядком. Итак, -1 <-2 действительноFALSE
, - Пара струн (
character
в R) сравниваются в лексикографическом порядке, что примерно означает, что они сравниваются в алфавитном порядке, символ за символом, слева направо. Поскольку "-1" и "-2" начинаются с одного и того же символа, мы переходим ко второму, а "2" следует после "1", поэтому "-2" следует после "-1" и, следовательно, "-1" < "-2" этоTRUE
, - При сравнении объектов несовпадающих типов у вас есть два основных варианта: либо вы даете ошибку, либо конвертируете один из типов в другой, а затем возвращаетесь к двум фактам, указанным выше. R берет 2-й маршрут и выбирает конвертировать
numeric
вcharacter
, который объясняет результат, который вы получили выше (все ваши несоответствующие примеры даютTRUE
).
Обратите внимание, что имеет больше смысла конвертировать numeric
в character
, а не наоборот, потому что большинство character
не может быть автоматически преобразован в numeric
значимым образом.
Я всегда думал, что это потому, что поведение по умолчанию состоит в том, чтобы рассматривать значения в кавычках как символы, а значения без кавычек - как двойные. Без явного объявления типов данных вы получите это:
> typeof(-1)
[1] "double"
> typeof("-1")
[1] "character"
> typeof(as.numeric("-1"))
[1] "double"
Только когда отрицательные числа заключаются в кавычки, они упорядочивают их в алфавитном порядке, потому что они являются символами.