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

5

我在处理数据时发现,在某个过程中做错了些什么。当我探索问题时,问题归结为 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) 来解决。 - akrun
我使用的是 tidyr 版本0.1,并且根据您的代码得到了正确的结果。也许您应该重新启动R并查看是否有所改变? - John Paul
看起来我使用的是开发版本。当我从CRAN安装了当前版本后,它就正常工作了。感谢@akrun指出这一点。 - Akira Murakami
1个回答

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

在发布之前,我检查了软件包的版本,因为它显示为0.1,所以我认为这是最新版本。但正如@akrun所提到的那样,我使用的是从github下载的开发版本。当我从CRAN安装软件包时,它可以正常工作。谢谢! - Akira Murakami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接