【问题标题】:how spread() in tidyr handles factor levelstidyr 中的 spread() 如何处理因子水平
【发布时间】: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, level2d$factor2 &lt;- factor(d$factor2, levels=c('level1', 'level2', 'level10')); spread(d, factor2, num) 似乎也解决了这个问题
  • 我有tidyr 0.1 版,我使用您的代码得到了正确的结果。也许你应该重新启动 R 看看是否会改变?
  • 看来我使用的是开发版。当我从 CRAN 安装当前的一个时,它运行良好。谢谢@akrun 指出。

标签: r spread tidyr


【解决方案1】:

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

> 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 安装软件包时,它工作正常。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 2023-03-27
  • 2015-10-20
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多