为什么此代码: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作业。现在,这不是编码的好方法,但是输出中的不一致会导致很多困惑和浪费时间。
最佳答案
这不仅是Unicode,还不仅仅是R;通常,sort
(甚至在* nix命令sort
中也可以)是特定于语言环境的。需要通过在所有机器上通过LC_COLLATE
(根据@alistaire的注释)设置"C"
(大概是Sys.setlocale
)来消除差异。
对我而言,在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"
在两台机器上都一样。
man
的* nix sort
页面给出了粗体警告*** 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"
,这将是一个潜在的解决方案。
关于r - 为什么在unicode字符串上的as.factor()对于每个操作系统都返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39339489/