一个国家相对于另一个国家的情节变量

时间:2013-08-01 00:48:40

标签: r ggplot2

我有几个国家和几年的时间序列数据,比如意大利,西班牙,美国。我想将一些国家 relative 的数据绘制到另一个国家:比如说意大利和西班牙的人均实际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']pwt$rgdpo,但不确定如何在不完全拆除数据框的情况下将此限制为特定国家/地区。 (我会知道如何通过使用子集函数为每个国家创建变量,然后通过划分然后重新创建数据框然后绘制来创建相对变量,但我想学习在这里做事的聪明方法。)

我希望解决方案对于存在NA或缺少日期(缺少日期可以由NA替换)是健壮的

我在我的例子中使用了ggplot2,但我也对开放式基础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

enter image description here

解决方案:感谢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

enter image description here

1 个答案:

答案 0 :(得分:3)

在绘制数据之前转换数据:

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)