如何使用 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"
)
这可能是关于 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"
)