【问题标题】:loop over dataframes in ggplot2在ggplot2中循环数据帧
【发布时间】:2012-10-26 18:46:09
【问题描述】:

我想使用来自多个不同数据帧的 ggplot 制作一系列图。我打算使用一个列表并迭代列表如下:

libraries <- objects() #make a list of the dataframes we want to graph
for(i in libraries) {
  # create initial plots
  x1 <- qplot(data= i, V1, reorder(V2,V3), color = V3) + coord_flip()
  x2 <- ggplot(i, aes(x=reorder(V2,V3), group=V3, color=V3)) + geom_bar() 
  x3 <- ggplot(i, aes(x=V1, group=V3, color=V3)) + coord_flip() + geom_bar()
}

但是我收到错误消息:

Error: ggplot2 doesn't know how to deal with data of class factor

大概是因为“库”现在是字符变量而不是数据框。有人对如何遍历数据框有其他建议吗?我想我可以将它们与 plyr 合并,然后 ggplot 数据的一个子集,但这似乎增加了更多的工作。

【问题讨论】:

  • 当你想使用列表时,不要列出字符变量。

标签: r ggplot2


【解决方案1】:

迭代 data.frames(只是定期组织的列表)的常用方法是使用lapply

 df1 <- data.frame(date = as.Date(10*365*rbeta(100, .5, .1)),group="a")
  df2 <- data.frame(date = as.Date(10*365*rbeta(50, .1, .5)),group="b")
  df3 <- data.frame(date = as.Date(10*365*rbeta(25, 3,3)),group="c")
  dfrmL <- list(df1,df2,df3)

 lapply(dfrmL, NROW)
[[1]]
[1] 100

[[2]]
[1] 50

[[3]]
[1] 25

在生成 ggplot 对象列表的情况下,我想 Hadley 方法将改为使用 llply,但我不是熟练的 plyr 用户,所以让我建议这个完全未经测试的代码模板:

plts <- lapply(dfrmL, function(df) qplot(qplot(data= df, 
                                          V1, reorder(V2,V3), color = V3) + 
                                  coord_flip()
       )  
 # you may need to explicitly print() or plot() the plots as stated in the R-FAQ.    
lapply(plts, print)

【讨论】:

  • 感谢@DWin,但是如果您想使用多个数据帧怎么办?假设我有 30 个数据框。我想我可以手动编写一个列表,但使用 objects() 的想法是获取数据框列表。您是否知道一种方法可以在您的工作区中获取 lapply -able 数据框列表?
  • 你的工作区是一个环境,有一个eapply函数。
  • @Zach - 查看这个问题以获取识别给定类的所有对象的示例(例如 data.frame),这可能对您有用:stackoverflow.com/questions/5158830/…
  • @DWin 我认为 joran 有一个很好的方法来获取可用的数据集列表,我会按照你的建议尝试遍历它们。谢谢
【解决方案2】:

一个更完整、可重现的例子可能会帮助我们提出一个更好的方法来实现这一点,但至少我可以建议替换:

libraries <- objects()

有了这个

libraries <- lapply(objects(), FUN = get)

这实际上将构建当前环境中所有对象的列表。但我不知何故怀疑数据框是您环境中的only 对象,所以也许您宁愿使用objectsls 获取对象列表,使用grep(或相关函数)根据名称仅查找您的数据帧,然后 get 仅使用 lapply 查找这些数据帧。

最后,您可以按照@Dwin 的描述对它们进行迭代。

【讨论】:

  • 感谢乔兰。我想要这样的东西:df1 &lt;- diamonds[1:100,] df2 &lt;- diamonds[101:200,] libraries &lt;- lapply(objects(), FUN = get) #make a list of the dataframes we want to graph plts &lt;- lapply(libraries, function(df) qplot(qplot(data= df, x,y, color = clarity)) ) lapply(plts, funtion(pic) print(pic) png(file=pic.jpg) dev(off) )
  • 试试ggsave 而不是png+dev.off(顺便说一句,你需要print())。
猜你喜欢
  • 2019-07-29
  • 2021-11-04
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 2020-08-02
相关资源
最近更新 更多