代码之家  ›  专栏  ›  技术社区  ›  Levan K.

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

  •  3
  • Levan K.  · 技术社区  · 10 年前

    我对R还很陌生,因此不得不用一个基本问题来打扰你。

    我有两个大型面板数据集(60个变量,每个变量来自30个国家,范围从1950-2013年)。这60个变量具有相同的名称,数据可能不同也可能不同。

    我的最终目标是创建60个网格,每个网格包含30个图:每个网格引用60个变量中的一个,并包含每个国家的图。每个图将包含两个折线图,一个来自第一个数据帧,另一个来自第二个数据帧(每个变量相同)。

    我以前在Stata中使用过全局变量和一个简单的循环来实现这一点。我一直在努力让这项工作在R。

    我现在将数据转换为宽格式(列:日期、国家、指标1、…指标60),但已经了解到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)  
    

    我仍然停留在do的确切表达上。我想到了这个遗憾的地方,我不知道如何指定两个y变量(对应于列versiondata中的旧变量和新变量)。

    mydf %>%
      group_by(indicator) %>%
      do({
        p <- ggplot(., aes(x=year)) + 
          geom_line(aes(y = ???)) 
        + facet_wrap(~country) + ggtitle("indicator")
        })
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   Señor O    10 年前

    这类事情的一个相当标准的方法是:

    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