如何在R中转换表格式

时间:2012-06-06 22:57:46

标签: r tapply

具体来说,

我使用了以下设置:

  

newdata< - tapply(mydata(#),list(mydata(X),mydata(Y)),sum)

我目前有一个目前列出的表格如下:

  

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 ##
  •   

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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