2014-07-21 127 views
1

我有以下数据显示按年份和月份分解的一些数字(最近发生的是第一次,但这不是问题)。从数据透视表中提取数据到数据框(即“反向透视”)

是否有(在R中)轻松地将“数据透视表”反转为具有两列“数据”和“值”的数据框的方法?当然,我可以编写一个小程序来做到这一点(或者,在这种情况下,几分钟的手动工作可以做到这一点:删除标签,将所有内容放在一行中,而不是在Excel中粘贴长行并填写时间戳与填充系列),但我很好奇这是否可以在R本地完成,因为它将在未来有用。

 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 

2002 315 45 397 750 380 343 794 110 777 323 746 735 
2003 748 711 315 395 726 359 799 138 719 345 787 772 
2004 109 776 764 738 384 368 396 700 384 398 340 781 
2005 747 720 191 938 188 135 185 177 753 733 313 399 
2006 726 316 713 135 103 794 751 165 348 701 798 128 
2007 763 123 276 111 150 145 163 226 248 950 917 879 
2008 167 873 775 130 184 780 444 115 107 325 781 701 
2009 897 143 805 104 743 158 113 727 755 764 394 710 
2010 349 743 180 762 359 744 102 775 109 178 369 799 
2011 746 706 800 737 786 194 195 105 101 784 795 142 
2012 124 794 141 126 284 207 877 803 832 175 140 763 
2013 796 100 896 119 810 134 100 183 792 185 743 792 
+0

现在,这是在SO上:这里有很多问题解决类似的问题,所以搜索可能是值得你的。 –

回答

2

有很多方法可以做到这一点。在香草R这是一种方式:

首先,让我们将您的数据读入一个数据框(假设您使用read.csv,但我抄袭了您的表格,所以我使用了这种方法):

mytable=read.table(stdin(),header=TRUE,row.names=1) 
0:   Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
1: 2002 315 45 397 750 380 343 794 110 777 323 746 735 
2: 2003 748 711 315 395 726 359 799 138 719 345 787 772 
3: 2004 109 776 764 738 384 368 396 700 384 398 340 781 
4: 2005 747 720 191 938 188 135 185 177 753 733 313 399 
5: 2006 726 316 713 135 103 794 751 165 348 701 798 128 
6: 2007 763 123 276 111 150 145 163 226 248 950 917 879 
7: 2008 167 873 775 130 184 780 444 115 107 325 781 701 
8: 2009 897 143 805 104 743 158 113 727 755 764 394 710 
9: 2010 349 743 180 762 359 744 102 775 109 178 369 799 
10: 2011 746 706 800 737 786 194 195 105 101 784 795 142 
11: 2012 124 794 141 126 284 207 877 803 832 175 140 763 
12: 2013 796 100 896 119 810 134 100 183 792 185 743 792 
13: 

df1=stack(mytable) 
mydf=data.frame(value=df1$values,month=df1$ind, 
       year=factor(rownames(mytable))[row(mytable)]) 
head(mydf) 
    value month year 
1 315 Jan 2002 
2 748 Jan 2003 
3 109 Jan 2004 
4 747 Jan 2005 
5 726 Jan 2006 
6 763 Jan 2007 

有可能是更有效的办法是,并有在包中,使这种任务变得简单了许多功能,但它并不难,只是做这样的事情。

0

使用stats:::reshape你可以走很长的路(弄清楚如何让月份被正确命名)。你的问题类似于this one

> reshape(x, direction = "long", varying = list(2:ncol(x)), idvar = "Year") 
     Year time Jan 
2002.1 2002 1 315 
2003.1 2003 1 748 
2004.1 2004 1 109 
2005.1 2005 1 747 
2006.1 2006 1 726 
2007.1 2007 1 763 

另一种选择是使用包reshape2

> library(reshape2) 
> melt(x, id.vars = "Year") 
    Year variable value 
1 2002  Jan 315 
2 2003  Jan 748 
3 2004  Jan 109 
4 2005  Jan 747 
5 2006  Jan 726 
6 2007  Jan 763 
7 2008  Jan 167