0

我有几个国家和几年的时间序列数据,比如意大利、西班牙、美国。我想绘制一些国家对于另一个国家的数据:比如绘制意大利和西班牙的实际人均 GDP 占美国的百分比。

这是数据的样子:

head(pwt)
         country isocode       year     rgdpo      pop
ESP-1950   Spain     ESP 1950-01-01  85002.27 27.99278
ESP-1951   Spain     ESP 1951-01-01 100241.94 28.22724
ESP-1952   Spain     ESP 1952-01-01 105170.11 28.47847
ESP-1953   Spain     ESP 1953-01-01 101322.59 28.73209
ESP-1954   Spain     ESP 1954-01-01 114573.78 28.98774
ESP-1955   Spain     ESP 1955-01-01 120839.95 29.24542

此处感兴趣的变量“人均实际 GDP”为rgdpo/pop

可悲的是,我没有走得很远。我知道如何选择一整列,例如pwt['rgdpo']or pwt$rgdpo,但不确定如何在不完全拆除数据框的情况下将其限制在特定国家/地区。(我会知道如何通过使用子集函数为每个国家创建变量,然后通过划分然后重新创建数据框然后绘图来创建相对变量,但我想在这里学习做事的聪明方法)。

我希望解决方案对 NA 的存在或缺失的日期具有鲁棒性(缺失的日期可以被 NA 替换)

我在示例中使用了 ggplot2,但我也对 base-R 解决方案持开放态度(作者:Hadley Wickham,Winston Chang,http ://cran.r-project.org/web/packages/ggplot2/ )。

为了获得一个可重现的例子,我从 pwt8 包中获取数据(作者:Achim Zeileis,http ://cran.r-project.org/web/packages/pwt8/ )。

# Get data
# install.packages("pwt8")
library("pwt8")
data("pwt8.0")
# names(pwt8.0)

# use -subset- to get specifc countries and variables.
countries <- c("USA", "ESP", "ITA")
variables <- c("country", "isocode", "year", "rgdpo", "pop")
pwt <- subset(pwt8.0, isocode %in% countries, select = variables)

# Plot GDP PER CAPITA with ggplot
library("ggplot2")
pwt$year<-as.Date(paste0(pwt$year,"-01-01"),format="%Y-%m-%d") # year as Date
ggp <- ggplot(pwt,aes(x=year,y=rgdpo/pop,color=as.factor(isocode),group=isocode)) + 
geom_line()  
ggp <- ggp + 
xlab("") +
ylab("") +  
ggtitle("Real GDP Per Capita (international $, 2005 prices, chain)") +
theme(legend.title = element_blank() ) + 
coord_trans(y = "log10")
ggp <- ggp + coord_cartesian(xlim=as.Date(c("2000-01-01","2012-01-01")),ylim=c(22000,45000))
ggp

在此处输入图像描述

解决方案:感谢Hong Ooi!

require("plyr")
pwt <- ddply(pwt, .(country), transform, gdppc.usa=(rgdpo/pop)/within(subset(pwt, isocode=="USA"),gdppc<-rgdpo/pop)$gdppc)
library("ggplot2")
ggp <- ggplot(subset(pwt,isocode==c("ESP","ITA")),aes(x=year,y=gdppc.usa,color=as.factor(isocode),group=isocode)) + 
geom_line()  
ggp <- ggp + 
  xlab("") +
  ylab("") +  
  ggtitle("Real GDP Per Capita Relative to USA (international $, 2005 prices, chain)") +
  theme(legend.title = element_blank() ) 
ggp

在此处输入图像描述

4

1 回答 1

3

Transform your data before plotting it:

require(plyr)
usa <- within(subset(pwt8.0, isocode=="USA"), gdppop <- rgdpo/pop)

# send this to ggplot2
dat <- ddply(pwt8.0, .(country), transform, gdppop_usa=(rgdpo/pop)/usa$gdppop)
于 2013-08-01T01:14:22.697 回答