r - 为什么 "a"< "A"在 R 中返回 TRUE?

标签 r lexicographic lexicographic-ordering

我的理解是,两个字符的字典顺序比较反射(reflect)了这些字符对应的Unicode数字代码的数值比较。例如

> utf8ToInt("a")
[1] 97
>
>
> utf8ToInt("b")
[1] 98
>
>
> # Because 97 < 98 the following lexicographical comparison returns TRUE
> "a" < "b"
[1] TRUE
>

但是,有一个我无法理解和解释的特殊情况:

> utf8ToInt("a")
[1] 97
>
>
> utf8ToInt("A")
[1] 65
>
>
> # Because 97 > 65 normally the following lexicographical comparison
> # is supposed to return FALSE, yet to my surprise it returns TRUE!
> "a" < "A"
[1] TRUE
>

我检查过Python 3.10.4 , DuckDB 0.7.0我可以确认他们都返回 FALSE作为比较结果'a' < 'A' 。然而,PostgreSQL 15.3喜欢 R ,返回TRUE 。所以我对这种行为差异感到非常困惑。

为什么RPostgreSQL返回TRUE用于比较"a" < "A"

最佳答案

R 中并不像 C 等其他语言那样存在单个原子 char 的概念;最接近的 R 是一个长度为 1 的字符串向量,其中单个字符串包含单个字符。这意味着比较运算符始终比较单个字符,就像比较任何其他字符串一样 - 也就是说,按字典顺序,而不是像 C 中那样比较 8 位数字。这种字典顺序与区域设置相关,由 Scollate 确定。函数在底层 C 代码中,通过读取 LC_COLLATE 环境变量来实现。

如果您想要基于 ASCII 的字典顺序,可以将 LC_COLLATE 设置为“C”:

Sys.setlocale("LC_COLLATE", "C")

然后我们有:

"a" < "A"
#> [1] FALSE

请注意,您以这种方式编写的任何代码都将不可移植。使用 utf8ToInt 或类似的工具会更强大,如果您想比较 R 中的 ASCII 值,请专门转换为数字。

关于r - 为什么 "a"< "A"在 R 中返回 TRUE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77130678/

相关文章:

linux - awk/gawk asorti() 问题

java - 在 Java 8 Comparator 中执行 Ordering.lexicographyal() 的等效方法是什么?

python - 忽略大小写的字符串排序列表

r - 使用管道运算符对同一行中另一列的变量值进行寻址

r - 如何计算数据框中每行的分类变量(级别)的频率

c++ - 生成字典排列 : Segmentation fault

c++ - 根据优先级按字典顺序对 vector 列表进行排序

c++ - 如何对(任意)POD C++ 结构施加词典顺序?

r - 从 R 工作目录中的所有 csv 中提取特定列(按名称)

r - 如何使通用 R 函数继承其输入的类?