2

我需要重新整理从世界银行数据库下载的一些数据。但是我有一些困难。

目标是它看起来像这样:

year CH DE US
1980 17383.38 11746.40 12179.56
1981 15833.74 9879.46 13526.19
1982 16133.97 9593.66 13932.68
1983 16007.82 9545.86 15000.09
1984 15229.82 9012.48 16539.38

我使用以下代码下载数据。需要 WDI 和 RJSONO 包。

wdi <-  WDI(country = c("CH","DE","US"), indicator = "NY.GDP.PCAP.CD" ,start = 1980, end = 2010, extra = F)

然后我通过以下方式重塑:

wdi2 <- reshape(wdi, direction = "wide", timevar="year", v.names="NY.GDP.PCAP.CD", idvar="country", drop="iso2c")

输出与我对其外观的期望不符:

> wdi2
             country NY.GDP.PCAP.CD.2010 NY.GDP.PCAP.CD.2009 NY.GDP.PCAP.CD.2008
    1    Switzerland            70572.66            65790.07            68555.37
    32       Germany            40163.82            40275.25            44132.04
    63 United States            46615.51            45305.05            46759.56 ...

这个好一点,但仍然不是我想要的:

> t(wdi2) 
                    1             32          63             
country             "Switzerland" "Germany"   "United States"
NY.GDP.PCAP.CD.2010 "70572.66"    "40163.82"  "46615.51"     
NY.GDP.PCAP.CD.2009 "65790.07"    "40275.25"  "45305.05"     
NY.GDP.PCAP.CD.2008 "68555.37"    "44132.04"  "46759.56"     
NY.GDP.PCAP.CD.2007 "59663.77"    "40402.99"  "46349.12" 

wdi 对象如下所示:

> wdi
   iso2c       country NY.GDP.PCAP.CD year
1     CH   Switzerland      70572.657 2010
2     CH   Switzerland      65790.067 2009
3     CH   Switzerland      68555.372 2008
4     CH   Switzerland      59663.770 2007
...
30    CH   Switzerland      16219.906 1981
31    CH   Switzerland      17807.340 1980
32    DE       Germany      40163.817 2010
33    DE       Germany      40275.251 2009
34    DE       Germany      44132.042 2008
...
62    DE       Germany      11746.404 1980
63    US United States      46615.511 2010
64    US United States      45305.052 2009
4

3 回答 3

3

使用reshape2.

require(reshape2)
dcast(wdi[,-2], year ~ iso2c, value.var = 'NY.GDP.PCAP.CD')

编辑。糟糕,我没有看到 Ananda Mahto 使用相同解决方案发表的评论。Anand,如果您发表评论作为答案,我将删除我的评论。

于 2013-10-06T12:43:15.767 回答
3

再次在电脑前......所以这里有一个更新。

正如我在评论中提到的,dcast“reshape2”对此非常方便。xtabs如果您只是在进行重塑步骤,则可以从基础 R 中获得类似的功能。

x <- xtabs(NY.GDP.PCAP.CD ~ year + iso2c, wdi)
head(x)
#       iso2c
# year         CH        DE       US
#   1980 17807.34 11746.404 12179.56
#   1981 16219.91  9879.457 13526.19
#   1982 16527.46  9593.657 13932.68
#   1983 16398.24  9545.859 15000.09
#   1984 15601.26  9012.479 16539.38
#   1985 15748.95  9125.121 17588.81

xtabs创建一个matrixclassxtabs”,因此要获得一个data.frame,将输出包装在as.data.frame.matrix.

head(as.data.frame.matrix(x))
#            CH        DE       US
# 1980 17807.34 11746.404 12179.56
# 1981 16219.91  9879.457 13526.19
# 1982 16527.46  9593.657 13932.68
# 1983 16398.24  9545.859 15000.09
# 1984 15601.26  9012.479 16539.38
# 1985 15748.95  9125.121 17588.81

要回答您在评论中提出的其他问题:但是,通过仅使用 reshape 函数将数据直接转换为正确格式,这难道不是一种更聪明的方法吗?. 答案是“是的。只需将您在最初reshape尝试中使用的内容替换为“idvar”和“timevar”即可。”

y <- reshape(wdi[-2], direction = "wide", idvar="year", timevar="iso2c")
## Optional step to clean up the resulting names
names(y) <- gsub("NY.GDP.PCAP.CD.", "", names(y))
head(y)
#   year       CH       DE       US
# 1 2010 70572.66 40163.82 46615.51
# 2 2009 65790.07 40275.25 45305.05
# 3 2008 68555.37 44132.04 46759.56
# 4 2007 59663.77 40402.99 46349.12
# 5 2006 54140.50 35237.60 44622.64
# 6 2005 51734.30 33542.78 42516.39

使用该reshape函数时,有时忽略参数名称的“id”和“time”部分并考虑它们的去向会有所帮助。ID 变量通常组成一列,而时间变量通常分布很广,每次一列。因此,即使我们可能将“国家”视为实际的 ID 变量,但对于您想要的数据格式,它更像是一个时间变量。

希望这会有所帮助,即使您已经接受了答案:)

于 2013-10-06T17:36:25.713 回答
0

这是一个基本的 R 解决方案。

# renames the NY.GDP column and drops all but two columns
trans_one <- function(dat) {
    newcol <- dat[1, "iso2c"]
    idx <- which(colnames(dat)=="NY.GDP.PCAP.CD")
    colnames(dat)[[idx]] <- newcol
    dat <- dat[,c(newcol, "year")]
    dat
}

# split by country
sp <- split(wdi, wdi$iso2c)

# merge 
fun <- function(x,y) {
    merge(x, trans_one(y), by="year", all=TRUE)
}   
Reduce(fun, x=tail(sp, -1), init=trans_one(sp[[1]]))

但是,reshape2现在对我来说看起来更简单。

于 2013-10-06T12:54:25.940 回答