2013-10-06 59 views
2

我需要重塑从worldbank数据库下载的一些数据。但是我有一些困难。如何重塑WDI数据

的目标是,它看起来像这样:

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 
+1

在我的手机,但它好像你可能只是在寻找'吨(WDI2 [-1])'之后就可以重新添加列名称并清理行名称。 – A5C1D2H2I1M1N2O1R2T1

+0

@Ananda Mahto Thx。但是,通过仅使用重塑函数,它们不是一种更智能的方法,可以将数据直接转换为正确的格式吗? – SWR

+0

正如我所说,在我的手机:)请张贴您的wdi物体的几行,我会看到想到什么。 – A5C1D2H2I1M1N2O1R2T1

回答

3

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

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

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创建的class “XTABS” 一matrix,因此要获得一个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尝试中使用的”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”和参数名的“时间”的部分,而是想想他们去哪里。 ID变量通常组成一列,时间变量通常分布很广,每次一列。因此,尽管我们可能会将“country”看作实际的ID变量,但对于您想要的数据格式而言,它更像是一个时间变量。

希望这有助于,即使你已经接受了答案:)

3

这是很容易使用reshape2来实现。

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

编辑。糟糕,我没有看到Ananda Mahto发布的评论采用相同的解决方案。阿南德,如果你发表你的评论作为答案,我会删除我的。

+0

没问题。无法验证,所以我不想发布任何内容。投掷前是否需要放置不需要的列? – A5C1D2H2I1M1N2O1R2T1

+0

其实没有。但是,我想明确表示您将有效地放下一列。 – Ramnath

+0

用两个基本的R解决方案添加了一个答案来补充这个问题。 :) – A5C1D2H2I1M1N2O1R2T1

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现在看起来更直截了当。

+0

这似乎是一个非常痛苦的基地R方法。请参阅[我的答案](http://stackoverflow.com/a/19211791/1270695),以获得'xtabs'和'reshape'解决方案,它们都是base R的一部分。 – A5C1D2H2I1M1N2O1R2T1