为什么这段代码:as.factor(c("\U201C", '"3', "1", "2", "\U00B5")),会在每个操作系统上返回不同的因子级别排序?
在Linux上:
> as.factor(c("\U201C",'"3', "1", "2","\U00B5")) [1] " "3 1 2 µ Levels: µ " 1 2 "3
在Windows上:
> as.factor(c("\U201C",'"3', "1", "2","\U00B5")) [1] " "3 1 2 µ Levels: "3 " µ 1 2
在Mac OS上:
>as.factor(c("\U201C",'"3', "1", "2","\U00B5")) [1] " "3 1 2 µ Levels: "3 " 1 2 µ
我让一些学生提交了一个包含as.numeric(as.factor(dat$var))的RMardkown作业。现在承认这不是一种好的编码方式,但输出中的不一致会导致很多混乱和浪费时间。
发布于 2016-09-06 10:07:54
它不只是Unicode,也不只是R;sort通常(甚至在*nix命令sort中)可以是特定于地区的。为了消除差异,需要在所有机器上通过Sys.setlocale (根据@alistaire的评论)设置LC_COLLATE (假设为"C")。
对我来说,在Windows (7)上:
sort(c("Abc", "abc", "_abc", "ABC"))
[1] "_abc" "abc" "Abc" "ABC" 而在Linux上(Ubuntu 12.04 ...哇,我需要升级那台机器)我得到
sort(c("Abc", "abc", "_abc", "ABC"))
[1] "abc" "_abc" "Abc" "ABC" 按照上面的方式设置区域设置
Sys.setlocale("LC_COLLATE", "C")给出
sort(c("Abc", "abc", "_abc", "ABC"))
[1] "ABC" "Abc" "_abc" "abc" 在两台机器上,完全相同。
sort的*nix man页面给出了粗体警告
\*\*\* WARNING \*\*\* The locale specified by the environment affects sort order. Set LC\_ALL=C to get the traditional sort order that uses native byte values.
更新:看起来像是在包含Unicode字符时重现了这个问题。这个问题可以追溯到sort --试着对示例中的向量进行排序。我似乎也不能将语言环境(LC_COLLATE或LC_CTYPE)更改为"en_AU.UTF-8",这可能是一个潜在的解决方案。
https://stackoverflow.com/questions/39339489
复制相似问题