中文符串排序和locale设置有关,如果使用base::sort,默认的locale设置可以用Sys.getlocale
查看。
> Sys.getlocale()
[1] "LC_COLLATE=Chinese (Simplified)_China.936;LC_CTYPE=Chinese (Simplified)_China.936;LC_MONETARY=Chinese (Simplified)_China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_China.936"
不同的系统可能默认的locale设置不一样,下列是在linux系统中的默认配置:
> Sys.getlocale()
[1] "LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_US.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C"
如果没有设置系统的locale,会导致中文字符串排序不一致。
解决办法:
- 显式设置系统locale
- 采用stringr::str_sort函数,显示指定locale。比如:
str_sort(names, locale = "zh")
这样,可以消除系统之间的差异,保持项目reproducible
。
另:SAS中文排序也有类似的问题,可以在
proc sort
中指定locale设置:proc sort data = df sortseq=linguistic(locale=zh_CN collation=pinyin) out=df_sorted; by var1; run;
sortseq=linguistic(locale=zh_CN collation=pinyin)
设置确保中文字符串以拼音的顺序排序。