将因子转换为数字背后发生了什么?

时间:2017-09-26 07:36:54

标签: r dplyr magrittr

这是一个小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

2 个答案:

答案 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"

其他So question

实际上已经讨论过类似的问题