R的reshape()函数更改列标签

时间:2013-03-24 18:52:48

标签: r reshape

我想将数据从long转换为宽格式。如果发现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 

我现在唯一能想到的就是手动重命名列名,如果你必须为多个数据集做这件事,这真的很烦人。

1 个答案:

答案 0 :(得分:15)

我在这里看不到问题,但是如果它让你感到困扰,那么还有一些选择。

在基础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

或者,使用套餐,您可以使用“reshape2”中的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是“值”,哪个是“Something”。


最后,如果您想使用reshape(我碰巧喜欢),您的实际数据会被此示例准确反映(只有一个)需要由一个或多个列“旋转”的列),这里还有两个选项:

使用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

使用subgsub编辑变量名称。 同样,因为我们知道我们只有一个变量通过旋转,可以很容易地预测需要进行的更改。

> 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