2014-07-21 5 views
1

다음 데이터는 연도 및 월별로 세분화되어 표시됩니다 (가장 최근 일이 먼저 발생하지만 문제는 없습니다).피벗 테이블에서 데이터 프레임으로 데이터 추출 (즉, "피벗 반전")

(R) "피벗 테이블을"데이터 "및"값 "의 두 열이있는 데이터 프레임으로 쉽게 역전시킬 수있는 방법이 있습니까? 물론, 나는 그것을하기 위해 작은 프로그램을 작성할 수있다. (또는,이 경우 몇 분의 수작업으로 할 수있다. 레이블을 제거하고, 한 줄에 모든 것을 넣고, Excel에 긴 줄을 붙여 넣고 Fill 시리즈와 함께 타임 스탬프), 그러나 이것이 미래에 유용 할 것이기 때문에 이것이 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

이제이 문제가 해결되었습니다. 유사한 문제를 해결할 수있는 많은 질문이 있으므로 여기를 검색하는 것이 좋습니다. –

답변

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