【发布时间】:2014-12-01 00:55:43
【问题描述】:
我在处理我的数据时发现我在这个过程中的某个时刻做错了。当我探讨这个问题时,问题归结为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
我想做的是将这个长格式的数据帧转换成宽格式。我认为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)似乎也解决了这个问题 -
我有
tidyr0.1 版,我使用您的代码得到了正确的结果。也许你应该重新启动 R 看看是否会改变? -
看来我使用的是开发版。当我从 CRAN 安装当前的一个时,它运行良好。谢谢@akrun 指出。