R

时间:2017-01-13 17:07:53

标签: r locale

我通过在R中排序字符串向量得到以下结果,这对我来说很奇怪。对所有人来说,这似乎并不相同。

dat <- data.frame(x=c('(Intercept)', 'x1', 'f3', 'i', 'j', 
                      '(', '(a)', '(A)', '(x)', '(X)'), stringsAsFactors=F)
dat[order(dat$x), ,drop=F]
#              x
# 6            (
# 7          (a)
# 8          (A)
# 3           f3
# 4            i
# 1  (Intercept)
# 5            j
# 9          (x)
# 10         (X)
# 2           x1

我希望输出为

#              x
# 6            (
# 7          (a)
# 8          (A)
# 1  (Intercept)
# 9          (x)
# 10         (X)
# 3           f3
# 4            i
# 5            j
# 2           x1

是否有任何设置可以控制术语的排序方式或发生的情况?我的同事获得了运行相同代码的预期输出。

会话信息

R> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Arch Linux

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] setwidth_1.0-4 colorout_1.1-2

1 个答案:

答案 0 :(得分:1)

正如评论中所述,这似乎与locale使用而不是R有关。我在bash中遇到了同样的问题。

$ echo "a\n(I)\n(\nx" | sort
(
a
(I)
x

但如果我设置LC_ALL=C,我会得到预期的结果。

$ echo "a\n(I)\n(\nx" | LC_ALL=C sort
(
(I)
a
x

启动R w LC_ALL=C时,我得到了预期的结果。

dat <- data.frame(x=c('(Intercept)', 'x1', 'f3', 'i', 'j', '(', '(a)', '(A)', '(x)', '(X)'), stringsAsFactors=F)
dat[order(dat$x), ,drop=F]
#              x
# 6            (
# 8          (A)
# 1  (Intercept)
# 10         (X)
# 7          (a)
# 9          (x)
# 3           f3
# 4            i
# 5            j
# 2           x1

以下是我系统的区域设置供参考:

$ locale                             
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
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="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=