R: сравнение as.character с as.integer или as.numeric - PullRequest
1 голос
/ 23 апреля 2020

Почему R дает следующие результаты:

> as.character('12') > as.integer(2)
[1] FALSE
> as.character('12') < as.integer(2)
[1] TRUE 

То же самое происходит с as.numeric вместо as.integer. Мой первоначальный инстинкт заключается в том, что такое сравнение между символом и целым числом не должно быть разрешено или, по крайней мере, должно приводить к ошибке или предупреждению.

Для хихиканья я попытался сравнить 12 и 2 как символы и получил аналогичное недоумение Результаты:

> as.character('12')>as.character('2')
[1] FALSE
> as.character('12')<as.character('2')
[1] TRUE 

Что дает?

Спасибо, -R

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Согласно ?Comparison

Сравнение строк в символьных векторах лексикографически c в строках с использованием упорядоченной последовательности используемой локали: см. Локали. Последовательность сопоставления локалей, таких как en_US, обычно отличается от C (которая должна использовать ASCII) и может удивлять. Остерегайтесь делать какие-либо предположения относительно порядка сопоставления: например, в эстонском языке Z находится между S и T, и сопоставление не обязательно символьное - в Dani sh aa сортируется как одна буква после z. В Wel sh ng может быть или не быть одной сортировочной единицей: если это так, то следует g. Некоторые платформы могут не учитывать языковой стандарт и всегда сортировать в числовом порядке байтов в 8-разрядном языковом стандарте или в порядке кодовой точки Unicode для языкового стандарта UTF-8 (и могут не сортировать в том же порядке для того же языка в разные наборы символов). Сопоставление не букв (пробелы, знаки пунктуации, дефисы, дроби и т. Д.) Еще более проблематично c.

1 голос
/ 23 апреля 2020

В строго типизированном языке программирования вы не можете сравнивать разные типы без явного определения того, как работает сравнение.

В R это немного более свободно. Сначала R преобразует целое число в строку, а затем выполняет лексикографическое (алфавитное) сравнение. Учтите это:

> as.character('a') < as.integer(2)
[1] FALSE
> as.character('a') > as.integer(2)
[1] TRUE

Единственный способ сравнения строки и целого числа для работы во всех случаях - это если R сначала преобразуется в символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...