用多个度量列将数据从长格式转换为宽格式

用多个度量列将数据从长格式转换为宽格式

当我想带来多个度量变量时,我很难找到最优雅和最灵活的方法将数据从长格式切换到宽格式。

例如,这里有一个长格式的简单数据框架。ID是主题,TIME是一个时间变量,而且XY是由ID在…TIME:

> my.df <- data.frame(ID=rep(c("A","B","C"), 5), TIME=rep(1:5, each=3), X=1:15, Y=16:30)> my.df

   ID TIME  X  Y1   A    1  1 162   B    1  2 173   C    1  3 184   A    2  4 195   B    2  5 206   C    2  6 217 
     A    3  7 228   B    3  8 239   C    3  9 2410  A    4 10 2511  B    4 11 2612  C    4 12 2713  A    5 13 2814 
      B    5 14 2915  C    5 15 30

如果我只想把TIME的列标题中包含X,我知道我可以用cast()reshape包装(或dcast()从…reshape2):

> cast(my.df, ID ~ TIME, value="X")
  ID 1 2 3  4  51  A 1 4 7 10 132  B 2 5 8 11 143  C 3 6 9 12 15

但我真正想做的是Y作为另一个度量值变量,并让列名同时反映度量值变量名称和时间值:

  ID X_1 X_2 X_3  X_4 X_5 Y_1 Y_2 Y_3 Y_4 Y_51  A   1   4   7   10  13  16  19  22  25  282  B   2   5   8   11  14  17  
  20  23  26  293  C   3   6   9   12  15  18  21  24  27  30

(FWIW,我真的不在乎X的后面是Y或者如果它们交织在一起X_1Y_1X_2Y_2等等)

我可以通过铸造-两次对长数据进行合并结果,尽管列名需要一些工作,如果需要添加第3或第4个变量,则需要对其进行调整XY:

merge(cast(my.df, ID ~ TIME, value="X"),cast(my.df, ID ~ TIME, value="Y"),by="ID", suffixes=c("_X","_Y"))

中的一些函数的组合reshape2和/或plyr应该能够更优雅地完成我的尝试,以及更清晰地处理多个度量变量。有点像cast(my.df, ID ~ TIME, value=c("X","Y")),这是无效的。但我还没弄明白。


呼如林
浏览 519回答 3
3回答

不负相思意

&nbsp;reshape(my.df,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;idvar = "ID",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;timevar = "TIME",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;direction = "wide")施予&nbsp; ID X.1 Y.1 X.2 Y.2 X.3 Y.3 X.4 Y.4 X.5 Y.51&nbsp; A&nbsp; &nbsp;1&nbsp; 16&nbsp; &nbsp;4&nbsp; 19&nbsp; &nbsp;7&nbsp; 22&nbsp; 10&nbsp; 25&nbsp; 13&nbsp; 282&nbsp; B&nbsp; &nbsp;2&nbsp; 17&nbsp; &nbsp;5&nbsp; 20&nbsp; &nbsp;8&nbsp; 23&nbsp; 11&nbsp; 26&nbsp; 14&nbsp; 293&nbsp; C&nbsp; &nbsp;3&nbsp; 18&nbsp; &nbsp;6&nbsp; 21&nbsp; &nbsp;9&nbsp; 24&nbsp; 12&nbsp; 27&nbsp; 15&nbsp; 30

慕容708150

使用data.table_1.9.5,这可以不使用melt因为它可以处理多个value.var柱子。您可以从here&nbsp;library(data.table)&nbsp;dcast(setDT(my.df), ID~TIME, value.var=c('X', 'Y'))&nbsp;#&nbsp; &nbsp;ID 1_X 2_X 3_X 4_X 5_X 1_Y 2_Y 3_Y 4_Y 5_Y&nbsp;#1:&nbsp; A&nbsp; &nbsp;1&nbsp; &nbsp;4&nbsp; &nbsp;7&nbsp; 10&nbsp; 13&nbsp; 16&nbsp; 19&nbsp; 22&nbsp; 25&nbsp; 28&nbsp;#2:&nbsp; B&nbsp; &nbsp;2&nbsp; &nbsp;5&nbsp; &nbsp;8&nbsp; 11&nbsp; 14&nbsp; 17&nbsp; 20&nbsp; 23&nbsp; 26&nbsp; 29&nbsp;#3:&nbsp; C&nbsp; &nbsp;3&nbsp; &nbsp;6&nbsp; &nbsp;9&nbsp; 12&nbsp; 15&nbsp; 18&nbsp; 21&nbsp; 24&nbsp; 27&nbsp; 30
打开App,查看更多内容
随时随地看视频慕课网APP