2012-06-06 42 views
0

具體來說,如何轉換表格式中的R

我用下面的設置:

newdata < - tapply(MYDATA(#),列表(MYDATA(X),MYDATA(Y )),總和)

我現在有目前列出了一個表,如下所示:

X =國家,Y =縣機智欣狀態,#=數值總的東西

  • __ Y1 Y2 Y3 YN
  • X1 ## ## ## ##
  • X2 ## ## ## ##
  • X3# ### ## ##
  • XN ## ## ## ##

我需要被列爲表如下:

  • X1 Y1 ##
  • X1 Y2 ##
  • X1 Y3 ##
  • X1 YN ##
  • X2 Y1 ##
  • X2 Y2 ##
  • X2 Y3 ##
  • X2 YN ##
  • XN Y1 ##
  • XN Y2 ##
  • XN Y3 ##
  • XN YN ##

回答

4
library(reshape2) 
new_data <- melt(old_data, id.vars=1) 

查找到?melt有關語法的更多細節。

例如:

> df <- data.frame(x=1:5, y1=rnorm(5), y2=rnorm(5)) 
> df 
    x   y1   y2 
1 1 -1.3417817 -1.1777317 
2 2 -0.4014688 1.4653270 
3 3 0.4050132 1.5547598 
4 4 0.1622901 -1.2976084 
5 5 -0.7207541 -0.1203277 
> melt(df, id.vars=1) 
    x variable  value 
1 1  y1 -1.3417817 
2 2  y1 -0.4014688 
3 3  y1 0.4050132 
4 4  y1 0.1622901 
5 5  y1 -0.7207541 
6 1  y2 -1.1777317 
7 2  y2 1.4653270 
8 3  y2 1.5547598 
9 4  y2 -1.2976084 
10 5  y2 -0.1203277 
+0

+1你贏了,不知道爲什麼需要這麼長的時間更新... – Justin

1

一些示例數據

mydata <- data.frame(num=rnorm(40), 
        gp1=rep(LETTERS[1:2],2), 
        gp2=rep(letters[1:2],each=2)) 

和應用tapply它:

tmp <- tapply(mydata$num, list(mydata$gp1, mydata$gp2), sum) 

tapply結果是一個矩陣,但你可以把它像一個表格並使用as.data.frame.table來轉換它。這不依賴於任何額外的軟件包。

as.data.frame.table(tmp) 

兩個不同的數據結構是這樣的:

> tmp 
     a   b 
A 8.381483 6.373657 
B 2.379303 -1.189488 
> as.data.frame.table(tmp) 
    Var1 Var2  Freq 
1 A a 8.381483 
2 B a 2.379303 
3 A b 6.373657 
4 B b -1.189488 
+0

尼斯,as.data.frame.table是相當快比融化但仍需要大量的記憶。 – Hansi