如何使用 tidyr::gather 将字符串保留在第一列?

How do I keep strings in first column with tidyr::gather?

这可能是关于 tidyr 的一个非常基本的问题,我刚刚开始学习,但在 SO 和 Google.[=20 中进行了大量搜索后似乎没有找到答案=]

假设我有一个数据框:

mydf<- data.frame(name=c("Joe","Mary","Bob"),
                  jan=1:3,
                  feb=4:6,
                  mar=7:9,
                  apr=10:12)

我想把它从宽改成长。之前,我用的是melt,所以:

library(reshape)
melt(mydf,id.vars = "name",measure.vars = colnames(mydf)[-1])

产生

   name variable value
1   Joe      jan     1
2  Mary      jan     2
3   Bob      jan     3
4   Joe      feb     4
5  Mary      feb     5
6   Bob      feb     6
7   Joe      mar     7
8  Mary      mar     8
9   Bob      mar     9
10  Joe      apr    10
11 Mary      apr    11
12  Bob      apr    12

我想用tidyr::gather,所以我试了

gather(mydf,month,sales,jan:apr)

产生

   name month sales
1     2   jan     1
2     3   jan     2
3     1   jan     3
4     2   feb     4
5     3   feb     5
6     1   feb     6
7     2   mar     7
8     3   mar     8
9     1   mar     9
10    2   apr    10
11    3   apr    11
12    1   apr    12

我在这里迷路了,因为我无法将名字保留在第一列中。

我在这里错过了什么?

######### 编辑以添加 #######

> R.Version()$version.string
[1] "R version 3.2.2 (2015-08-14)"
> packageVersion("tidyr")
[1] ‘0.3.0’

看起来在 tidyr 0.3.0 中您需要将因子列 name 转换为字符。我不确定为什么它从 0.2.0 版本开始发生了变化,它在没有转换为字符的情况下工作。不过,我们开始吧...

gather(transform(mydf, name = as.character(name)), month, sales, jan:apr)
#    name month sales
# 1   Joe   jan     1
# 2  Mary   jan     2
# 3   Bob   jan     3
# 4   Joe   feb     4
# 5  Mary   feb     5
# 6   Bob   feb     6
# 7   Joe   mar     7
# 8  Mary   mar     8
# 9   Bob   mar     9
# 10  Joe   apr    10
# 11 Mary   apr    11
# 12  Bob   apr    12

R.version.string
# [1] "R version 3.2.2 (2015-08-14)"
packageVersion("tidyr")
# [1] ‘0.3.0’

感谢@aosmith 找到已关闭的 github 问题。您现在应该可以毫无问题地使用开发版本。要安装开发版本,请使用

devtools::install_github(
    "hadley/tidyr", 
    ref = "2e08772d154babcc97912bcae8b0b64b65b964ab"
)