在两个数据集中的相同列和行上循环ggplot / ggvis

时间:2015-08-12 16:07:01

标签: r plot ggplot2 ggvis

我是R的新手,所以不得不打扰一个基本问题。

我有两个大型面板数据集(60个变量,每个变量适用于30个国家,范围从1950年到2013年)。 60个变量具有相同的名称,数据可能会有所不同。

我的最终目标是创建60个网格,每个网格包含30个图表:每个网格指的是60个变量中的一个,并包含每个国家/地区的图表。每个图将包含2个折线图,一个来自第一个数据框,另一个来自第二个(每个相同的变量)。

我之前在Stata中使用全局变量和一个简单的循环完成了这个。我被困在试图在R中完成这项工作。

我现在将数据转换成宽格式(列:Date,Country,Indicator1,... Indicator60),但是已经读过ggplot2在长格式(?)中效果更好。

我的主要问题是如何循环(for,lapply,function ..)。

如果不是答案,我会非常感谢如何解决这个问题的想法或提示,以便在需要时设法提出更具体的问题。

编辑:根据要求,在可重现的数据样本下面

year <- c(2010, 2011, 2012, 2013, 2010, 2011, 2012, 2013,2010, 2011, 2012,     
    2013, 2010, 2011, 2012, 2013, 2010, 2011, 2012, 2013, 2010, 2011, 2012,    
    2013, 2010, 2011, 2012, 2013, 2010, 2011, 2012, 2013)
country <- c(rep("Australia", times =8), rep("Canada", times = 8),  
    rep("Australia", times =8), rep("Canada", times = 8))
indicator <- c(rep("Apples", times = 16), rep("Bananas", times = 16))
versiondata <- c(rep("new", times = 4), rep("old", times = 4), rep("new",  
    times = 4), rep("old", times = 4), rep("new", times = 4), rep("old", 
    times = 4), rep("new", times = 4), rep("old", times = 4))
value <- runif(32)
mydf <- data.frame(year, country, indicator, versiondata, value)  

我仍然坚持做的确切表达。我想出了这个抱歉,我不知道如何指定两个y变量(对应于列versiondata中的旧和新)。

mydf %>%
  group_by(indicator) %>%
  do({
    p <- ggplot(., aes(x=year)) + 
      geom_line(aes(y = ???)) 
    + facet_wrap(~country) + ggtitle("indicator")
    })

1 个答案:

答案 0 :(得分:1)

对于这种事情,一种相当标准的方法是:

by(mydf, mydf$indicator, function(X) ggplot(X, aes(year, value, color = versiondata)) + geom_line() + facet_wrap(~country))

使用指标名称作为标题可以采取更多技巧:

lapply(unique(mydf$indicator), function(X) ggplot(mydf[mydf$indicator == X,], aes(year, value, color = versiondata)) + geom_line() + facet_wrap(~country) + labs(title = X))

每个指标应该如下所示:

enter image description here