在ggplot2中遍历数据框

3

我想使用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

可能是因为'libraries'现在是一个字符变量而不是数据框。有没有其他人对如何迭代数据框有建议?我想我可以使用plyr将它们合并,然后绘制数据的子集,但这似乎会增加更多的工作。


当你想要使用列表时,不要创建字符变量的列表。 - IRTFM
2个回答

3
通常遍历数据框(就是有规律地组织的列表)的方法是使用 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”的数据框列表吗? - zach
你的工作空间是一个环境,并且有一个 eapply 函数。 - IRTFM
@Zach - 请查看此问题,以了解如何识别给定类别的所有对象(例如 data.frame),这可能对您有用:https://dev59.com/pW435IYBdhLWcg3w4UQc - Chase
@DWin 我认为joran有一种很好的获取可用数据集列表的方法,我会像你建议的那样尝试迭代它们。谢谢。 - zach

3

提供一个更完整、可重复的示例可能有助于我们建议一种更好的方法来实现这个目标,但至少我可以建议替换:

libraries <- objects()

使用这个

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

这将实际上构建一个当前环境中所有对象的列表。但我有点怀疑数据框不是您环境中唯一的对象,因此您可能更喜欢使用objectsls获取对象列表,使用grep(或相关函数)基于其名称仅查找数据框,然后使用lapply只获取这些数据框。

最后,您可以按@Dwin所述迭代它们。


谢谢Joran。我想做这样的事情:df1 <- diamonds[1:100,] df2 <- diamonds[101:200,] libraries <- lapply(objects(), FUN = get) #make a list of the dataframes we want to graph plts <- lapply(libraries, function(df) qplot(qplot(data= df, x,y, color = clarity)) ) lapply(plts, funtion(pic) print(pic) png(file=pic.jpg) dev(off) ) - zach
尝试使用 ggsave 代替 png+dev.off(顺便提一下,你需要在中间加上 print())。 - baptiste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接