R-基于嵌套列表的标题图
我有两个列表,每个列表中还有两个包含数据帧的列表(换句话说,嵌套列表)。我希望根据主列表和嵌套列表的名称绘制每个数据帧并为其命名 例如,假设我们有:R-基于嵌套列表的标题图,r,list,nested-lists,R,List,Nested Lists,我有两个列表,每个列表中还有两个包含数据帧的列表(换句话说,嵌套列表)。我希望根据主列表和嵌套列表的名称绘制每个数据帧并为其命名 例如,假设我们有: a=list( list(a=data.frame(x=rpois(5,1),y=rpois(5,1)), b=data.frame(x=rpois(5,1),y=rpois(5,1))), list(c=data.frame(x=rpois(5,1),y=rpois(5,1)), d=data.frame(x=
a=list(
list(a=data.frame(x=rpois(5,1),y=rpois(5,1)),
b=data.frame(x=rpois(5,1),y=rpois(5,1))),
list(c=data.frame(x=rpois(5,1),y=rpois(5,1)),
d=data.frame(x=rpois(5,1),y=rpois(5,1))))
我们有主要名单的名称:
names(a)=c("alpha","bravo")
在两个主要列表alpha
和bravo
中,我们还有两个列表,charlie
和delta
:
for(i in 1:length(a)) {
names(a[[i]])=c("charlie","delta") }
我可以使用lappy
循环遍历每个列表并绘制数据帧,但是我很难将标题与每个数据帧的主列表名称(alpha
和bravo
)和嵌套列表(charlie
和delta
)结合起来。例如,在本例中,我希望有四个图被称为:alpha_charlie
,alpha_delta
,bravo_charlie
,和bravo_delta
lapply(a,function(i) {
lapply(names(i), function(j) {
ggplot()+
geom_point(data=i[[j]],aes(x,y))+
opts(title=paste(names(i),j,sep="_")) #Here is where I am struggling!
} ) } )
任何帮助都将不胜感激。谢谢大家! 您可以在索引序列上使用lappy,而不是名称本身
lapply(seq(a), function(i){
lapply(seq(a[[i]]), function(j){
ggplot() +
geom_point(data = a[[i]][[j]], aes(x, y))+
opts(title = paste(names(a)[i], names(a[[i]])[j], sep = "_"))
})})
在你的第一圈,你已经失去了名字,所以这是令人恶心的结局。Dason给了你一个好机会 但是,我认为最好将data.frames列表转换为单个data.frames!并使用刻面
nested.fun <- function(l) {
out <- ldply(l, data.frame)
names(out)[1] <- 'inner.id'
return(out)
}
one.df <- ldply(a, nested.fun)
ggplot(one.df, aes(x,y))+geom_point()+facet_grid(.id~inner.id)
nested.fun在这种情况下,我的首选是坚持使用for
循环。这样做可以很容易地将绘图保存到新列表中,然后使用grid.arrange
和do.call
一次打印所有绘图
library(ggplot2)
plot_list = list() # Save plots to list.
for (name_1 in names(a)) {
for (name_2 in names(a[[name_1]])) {
title_string = paste(name_1, name_2, sep="_")
plt = ggplot(data=a[[name_1]][[name_2]], aes(x=x, y=y)) +
geom_point() +
opts(title=title_string)
plot_list[[title_string]] = plt
}
}
library(gridExtra)
png("plots.png", height=600, width=600)
do.call(grid.arrange, plot_list)
dev.off()
效果很好。我试着用for循环做一些类似的事情,但是失败了。类似的方法。谢谢