我有几个国家和几年的时间序列数据,比如意大利,西班牙,美国。我想将一些国家 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
解决方案:感谢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
答案 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)