我在处理数据时发现,在某个过程中做错了些什么。当我探索问题时,问题归结为 tidyr
包中 spread()
函数的以下行为。
下面是一个演示性例子。假设我们有一个如下所示的数据框。
> 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
我想要做的是将这个长格式的数据框转换为宽格式。我认为使用spread()
是一种方法。然而,结果并不如我所预期。
> spread(d, factor2, num)
factor1 level1 level2 level10
1 A 1 3 2
2 B 4 6 5
3 C 7 9 8
如果factor1是“A”,factor2是“level2”,那么值应该是2,但是得到的宽格式为3。显然,num按照factor2的字母顺序排序(level1 > level10 > level2),并放入宽格式中。但是,当它这样做时,factor2标签保留在原始数据框中出现的相同顺序(level1 > level2 > level10)。请问有人能解释为什么会发生这种情况(和/或我在哪里可以找到相关信息)?
tidyr
的开发版本,列名与数字匹配,但列的顺序是level1, level10, level2
。这也可以通过d$factor2 <- factor(d$factor2, levels=c('level1', 'level2', 'level10')); spread(d, factor2, num)
来解决。 - akruntidyr
版本0.1,并且根据您的代码得到了正确的结果。也许您应该重新启动R并查看是否有所改变? - John Paul