我有几个国家和几年的时间序列数据,比如意大利、西班牙、美国。我想绘制一些国家相对于另一个国家的数据:比如绘制意大利和西班牙的实际人均 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