tidyr中的spread()如何处理因子水平

Aki*_*ami 5 r spread tidyr

我正在操纵我的数据,发现我在这个过程中的某些方面做错了.当我探讨这个问题,这个问题归结为以下行为spread()tidyr包.

这是一个示范性的例子.我们假设我们有一个如下数据框.

> d <- data.frame(factor1 = rep(LETTERS[1:3], each = 3),
+   factor2 = rep(paste0("level", c(1, 2, 10)), 3),
+   num = 1:9
+ )  
> d
  factor1 factor2 num
1       A  level1   1
2       A  level2   2
3       A level10   3
4       B  level1   4
5       B  level2   5
6       B level10   6
7       C  level1   7
8       C  level2   8
9       C level10   9
Run Code Online (Sandbox Code Playgroud)

我想要做的是将这个长格式的数据帧转换为宽格式.我认为这spread()是一种方法.然而,结果并不是我的预期.

> spread(d, factor2, num)
  factor1 level1 level2 level10
1       A      1      3       2
2       B      4      6       5
3       C      7      9       8
Run Code Online (Sandbox Code Playgroud)

如果factor1为"A"且factor2为"level2",则该值应为2,但结果宽格式为3.显然,num按factor2的字母顺序排序(level1> level10> level2)并放入宽幅.但是当它出现时,factor2标签保留的顺序与它们在原始数据框中出现的顺序相同(level1> level2> level10).

谁能解释为什么会发生这种情况(和/或我能找到相关信息的地方)?

KFB*_*KFB 9

使用提供的数据,我得到了不同的结果:

> packageVersion("tidyr")
[1] ‘0.1’
spread(d, factor2, num)
  factor1 level1 level10 level2
1       A      1       3      2
2       B      4       6      5
3       C      7       9      8
Run Code Online (Sandbox Code Playgroud)