这里有一个小的data.frame
:
e = data.frame(A=c(letters[1:5], 1:5))
当我执行以下命令时,我有点困惑发生了什么:
unclass(e$A) %>% as.numeric()
我得到了以下输出:
[1] 6 7 8 9 10 1 2 3 4 5
为什么
a:e
被视为 6:10
?data.frame
会创建一个因子,可以通过使用 str(e)
来查看:
'data.frame': 10 obs. of 1 variable:
$ A: Factor w/ 10 levels "1","2","3","4",..: 6 7 8 9 10 1 2 3 4 5
这个因素有不同的级别,按字母顺序排序(其中R在字母前排序数字),levels(e$A)
:
[1] "1" "2" "3" "4" "5" "a" "b" "c" "d" "e"
as.numeric
函数将一个因子(factor)转换为各水平的指数值,即第一个水平得到值1(这意味着1保持不变),第六个水平得到值6(这意味着"a"
变成了6)。
在这种情况下,您已经使用unclass()
强制进行了此转换,从而产生了您看到的数字向量。 as.numeric
只会删除levels
属性。
?Comparison
告诉我们,任何字符向量之间的比较(例如对它们进行sort
排序)都基于当前语言环境的整理顺序。
注意:这与%>%
操作符无关。
?sort
表明:"a">"1"
#### [1] TRUE
"a">"A"
#### [1] FALSE
编辑:
关于大写字母和小写字母之间的字母优先级,它确实取决于您的系统区域设置(英语遵循us_en
,非英语区域可以遵循ASCII
或其他,请参见wikipedia段落)。尝试这个:
Sys.setlocale("LC_COLLATE", "C")
sort(c(1,2,3,"a", "b", "c", "A", "B", "C"))
#### [1] "1" "2" "3" "A" "B" "C" "a" "b" "c"
Sys.setlocale("LC_COLLATE", "French_France.1252")
sort(c(1,2,3,"a", "b", "c", "A", "B", "C"))
#### [1] "1" "2" "3" "a" "A" "b" "B" "c" "C"
类似的问题已经在这个问题中讨论过了。