这是一个小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
?
答案 0 :(得分:8)
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
将一个因子转换为级别的索引,即第一级获得值1(这意味着1保持为1),第六级获得值6(这意味着"a"
变为6)
在这种情况下,您实际上已经使用unclass()
强制执行此转换,这会生成您看到的数字向量。 as.numeric
只会删除levels
属性。
?Comparison
告诉我们字符向量(例如sort
)之间的任何比较都是基于当前语言环境的整理顺序。
注意:这与%>%
无关。
答案 1 :(得分:3)
你的问题引发了一个深埋在每种计算机语言核心的问题。这是如何订购角色的问题。
R帮助文件?sort
说明了这一点:
字符向量的排序顺序取决于整理 正在使用的语言环境的序列:请参阅比较。排序顺序 因素是其水平的顺序
所以你可以尝试找到你的语言环境。您还需要检查定义国际字符串排序和比较规则的ISO 14651标准。 根据您的位置,您可能会发现订购非常特殊的字符的差异,但是关于数字,我猜它们总是第一。
"a">"1"
#### [1] TRUE
"a">"A"
#### [1] FALSE
修改强>
关于大写和小写之间的字母顺序优先级,它确实取决于您的系统区域设置(英语跟随us_en
,非英语区域设置可以跟随ASCII
或其他人看到此wikipedia paragraph)。试试这个:
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"
实际上已经讨论过类似的问题