在R中重建数据

时间:2013-08-30 11:55:49

标签: r reshape

现在我有一个这样的数据集:

  country index     value
1     AUS   GPD 0.8004142
2     AUS   GNI 0.8251010
3     AUS   CPI 0.6675700
4     HUN   GPD 0.3520509
5     HUN   GNI 0.4821505
6     HUN   CPI 0.3623341
7     USA   GPD 0.6431452
8     USA   GNI 0.9119910
9     USA   CPI 0.6616684

然后我使用subset和merge命令重建数据,如下所示

gdp<-subset(x,index=="GDP")# subset by index
> gdp
  country index     value
1     AUS   GDP 0.8004142
4     HUN   GDP 0.3520509
7     USA   GDP 0.6431452
names(gdp)[3]<-"GDP" # rename 'value' to 'GDP'
gdp<-gdp[c(-2)]
gni<-subset(x,index=="GNI")
names(gni)[3]<-"GNI"
gni<-gni[c(-2)]
cpi<-subset(x,index=="CPI")
names(cpi)[3]<-"CPI"
cpi<-cpi[c(-2)]
total<-merge(gdp, gni, by="country")
total1<-merge(total, cpi, by="country")
> total1
  country       GDP       GNI       CPI
1     AUS 0.8004142 0.8251010 0.6675700
2     HUN 0.3520509 0.4821505 0.3623341
3     USA 0.6431452 0.9119910 0.6616684

我正在寻找一种简单的方法来重建这样的数据。 请提供一些建议(示例代码)。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

这是一个非常基本的“重塑”问题。

最直接的方法是使用“reshape2”中的dcast

> library(reshape2)
> dcast(mydf, country ~ index)
  country       CPI       GNI       GPD
1     AUS 0.6675700 0.8251010 0.8004142
2     HUN 0.3623341 0.4821505 0.3520509
3     USA 0.6616684 0.9119910 0.6431452

或者,在基数R中,有xtabsxtabs输出matrix,因此使用as.data.frame.matrix来获取data.frame

> as.data.frame.matrix(xtabs(value ~ country + index, mydf))
          CPI       GNI       GPD
AUS 0.6675700 0.8251010 0.8004142
HUN 0.3623341 0.4821505 0.3520509
USA 0.6616684 0.9119910 0.6431452