我想把我的数据从长格式转换成宽格式。如果发现reshape
更改列标签真的很烦人,有什么方法可以避免吗?
例如,如果我有像这样的长格式数据:
Year Name Value
1996 a 1
1997 a 2
1998 b 3
1999 b 4
我将像这样使用reshape()
reshape(long, timevar = "Year", idvar = "Name", direction = "wide")
转换本身工作得很好,但是列名看起来像这样:
Name Time.1996 Time.1997 Time.1998 Time.1999
我现在唯一能想到的是手动重命名列名,如果你必须为多个数据集做这件事,这真的很烦人。
我在这里没有看到问题,但是如果它让你很困扰,这里有几个选择。
在基数R中,您可以使用xtabs
(很多时候)进行这种类型的转换。
as.data.frame.matrix(xtabs(Value ~ Name + Year, long))
# 1996 1997 1998 1999
# a 1 2 0 0
# b 0 0 3 4
或者,借助包,您可以使用" shape2"中的dcast
。
library(reshape2)
dcast(long, Name ~ Year)
# Using Value as value column: use value.var to override.
# Name 1996 1997 1998 1999
# 1 a 1 2 NA NA
# 2 b NA NA 3 4
我同意以这种方式对单个变量进行重塑,这样修改名称是很烦人的。但是,记住reshape
函数的其他典型用例,您就会发现它非常有用。例如,让我们向"长"数据集添加另一列,然后重塑:
> long$Something <- 5:8
> reshape(long, timevar = "Year", idvar = "Name", direction = "wide")
Name Value.1996 Something.1996 Value.1997 Something.1997 Value.1998
1 a 1 5 2 6 NA
3 b NA NA NA NA 3
Something.1998 Value.1999 Something.1999
1 NA NA NA
3 7 4 8
如果不保留正在被重塑的列的名称,您将无法知道哪个1996是"Value",哪个是"Something"。
最后,如果您想使用reshape
(我碰巧喜欢),和您的实际数据准确地反映在这个示例中(只有一列需要由一个或多个列"pivot"),这里还有两个选项:
使用setNames
。很容易预测名称应该是什么:ID变量的向量,后面跟着时间变量。
> setNames(reshape(long, timevar = "Year", idvar = "Name", direction = "wide"),
+ c("Name", long$Year))
Name 1996 1997 1998 1999
1 a 1 2 NA NA
3 b NA NA 3 4
使用sub
或gsub
编辑变量名。同样,因为我们知道我们只有一个pivot变量,所以很容易预测需要进行的更改。
> wide <- reshape(long, timevar = "Year", idvar = "Name", direction = "wide")
> names(wide)
[1] "Name" "Value.1996" "Value.1997" "Value.1998" "Value.1999"
> names(wide) <- gsub("Value.", "", names(wide))
> wide
Name 1996 1997 1998 1999
1 a 1 2 NA NA
3 b NA NA 3 4