gpt4 book ai didi

r - 如何 reshape WDI 数据

转载 作者:行者123 更新时间:2023-12-02 08:38:08 25 4
gpt4 key购买 nike

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

目标是它看起来像这样:

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)

然后我按照以下方式 reshape :

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

最佳答案

又在电脑前了……所以这里有一个更新。

正如我在评论中提到的,“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 创建一个“xtabs”的矩阵,所以要得到一个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 变量,但对于您想要的数据格式,它更像是一个时间变量。

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

关于r - 如何 reshape WDI 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19207341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com