如何在R中将列转置/切割成行

时间:2013-02-20 22:41:38

标签: r reshape reshape2

我正在处理国家级数据的大型数据集,这些数据采用国家/地区年度格式,并以下列形式显示(为方便起见):

Country     Variable of Interest  Year
Bolivia     5                     1990
Bolivia     6                     1991
Bolivia     7                     1992
Cambodia    8                     1990
Cambodia    9                     1991
Cambodia    10                    1992
Russia      11                    1990
Russia      12                    1991
Russia      13                    1992

由于与同事合作,如何将数据输入此表单?:

Country   1990    1991   1992
Bolivia    5        6     7
Cambodia   8        9     10
Russia     11       12    13

我正在使用R版本2.15.2并使用WDI库来向世界银行查询信息。到目前为止,我正在附加我的代码,它将适用于单个国家/地区。然后,当我尝试为所有国家/地区执行此操作时,我会粘贴代码。任何帮助将不胜感激。感谢。

library(WDI)
x<-WDI(country="US",indicator="NY.GDP.MKTP.CD",start = 1980, end=2012)
a<-as.matrix(x$country)
b<-x$year
x<-as.data.frame(t(x))
colnames(x)<-b
x<-x[-1:-2,][-2,]
x<-x[,order(ncol(x):1]
a<-a[1,]
rownames(x)<-a
x

当我尝试更改为所有国家/地区时的更改是在WDI中将“US”更改为“all”。

我很感激这方面的所有帮助!先感谢您!

2 个答案:

答案 0 :(得分:4)

使用reshape2包:

假设您的data.framedf(我将第二列名称更改为Interest):

require(reshape2)
# use dcast as:
dcast(df, Country ~ Year, value.var="Interest")


#    Country 1990 1991 1992
# 1  Bolivia    5    6    7
# 2 Cambodia    8    9   10
# 3   Russia   11   12   13

答案 1 :(得分:1)

 reshape(dfrm, timevar="Year", direction="wide", idvar='Country')
#-------------
   Country Variable_of_Interest.1990 Variable_of_Interest.1991 Variable_of_Interest.1992
1  Bolivia                         5                         6                         7
4 Cambodia                         8                         9                        10
7   Russia                        11                        12                        13

如果您想根据自己的喜好修改名称,那么setNames可能很有用:

setNames( reshape(dfrm, timevar="Year", direction="wide", idvar='Country'), 
           c("Country", unique(dfrm$Year) )  )
#--------------
   Country 1990 1991 1992
1  Bolivia    5    6    7
4 Cambodia    8    9   10
7   Russia   11   12   13

请注意,除非引用,否则带有前导数字的列名称无效。