如何在索引变量时使用lapply与ggplot2

时间:2016-01-22 00:32:36

标签: r ggplot2 lapply

我想从一个大数据框中生成数百个连续数据的箱图,按因子"年"分层。我首先从原始数据框创建一个包含每个因变量和年份的列表。

这是一个看起来像我的示例数据集:

l<-list(data.frame(year=c(rep("2010",10),rep("2011",10),rep("2012",10)),     
var1=sample(1:100,30,replace=T)), 
    data.frame(year=c(rep("2010",10),rep("2011",10),rep("2012",10)), 
var2=sample(100:200,30,replace=T)),
    data.frame(year=c(rep("2010",10),rep("2011",10),rep("2012",10)), 
var3=sample(25:50,30, replace=T)))

下一步是在列表中应用ggplot2函数。这些函数都没有产生图:

lapply(l, function (j) ggplot(j, aes(x=year, y=j[,2], fill=year)) +    
 geom_boxplot() + ylab(names(j[2])) )

lapply(l, function (j) ggplot(j, aes(x=year, y=j[[1]][2], fill=year)) +  
 geom_boxplot() + ylab(names(j[2])) )

从这些脚本生成相同的错误消息:

  

错误:图中没有图层&#34;

实际上,我的数据框要大得多 - 2800个观察结果和250多个具有唯一描述性名称的不同变量(例如&#34; M2_loss&#34;,&#34; SSC&#34;)。每个变量都有不同的比例,因此使用facet不是一个好的解决方案。使这个问题与stackoverflow上的其他示例不同的是,我试图索引数据而不是明确地命名它。重要的是我捕获每个变量的唯一名称并使用它来标记y轴。

关于如何进行的任何想法?

3 个答案:

答案 0 :(得分:0)

如果你想让lapply函数在hte控制台屏幕设备上实际创建输出,那么就需要添加一个+geom_boxplot调用:

 plist <- lapply(l, function (j) print( ggplot(j, aes(x=year, y=j[,2], fill=year))     
  ylab(names(j[2])) +geom_boxplot() ) )

如果您想存储在列表中,然后稍后省略打印电话:

 plist <- lapply(l, function (j)  ggplot(j, aes(x=year, y=j[,2], fill=year)) +
                                      ylab(names(j[2])) +geom_boxplot() ) 
# To print ...
plist[[1]]

答案 1 :(得分:0)

如果我了解您的需求,我认为您可以使用aes_string代替aes来简化操作。这允许您将感兴趣的变量指定为字符串而不是名称。以下是使用精心设计的iris数据集的简单示例:

lapply( names(iris)[1:4], function(n) ggplot(data = iris, aes_string(y = n, x = "Species")) + geom_boxplot() ) 这会为iris数据集中的四个定量变量中的每一个生成并排的箱图(按物种),并且应该可以轻松调整数据框。

答案 2 :(得分:0)

问题原来是R(3.2.2)的旧版本让Rstudio感到困惑。一旦我删除旧版本,解决了问题 - 我的原始lapply()函数(第一个示例)工作正常。