Boxplot与for循环

时间:2013-09-22 02:10:10

标签: r ggplot2 melt

我有一个名为mylist的数据框列表。列表的标题是人的名字,数据框包含与这些名称相关的数据的列(日期,高度,重量等)

names(mylist[1])
[1] "John"
names(mylist[2])
[1] "Susan"


mylist[[1]]
[1] name  date hight weight ....
    John  1950 1.81  78
    John  1948 1.60  60
    John  1935 1.50  55

mylist[[2]]
[1] name  date hight weight ....
    Susan 1985 1.40  40    .
    Susan 1995 1.45  60
    Susan 1990 1.25  40

我想为每个指标创建一个箱线图:一个用于高度的箱图,一个用于重量等。我想在每个度量标准的箱图中包含所有人的信息。例如,我想要一个包含John,Susan等信息的高度盒子图。

这是我对循环的尝试,但它不起作用。

for(s in 3:21) {
boxplot(x=for(i in 1:99){ mylist[[i]][s]}))
}

大家好,我申请了nograpes解决方案。虽然,他建议的代码:

ggplot(melted.df,aes(x=name,y=value)) + 
geom_boxplot() + facet_grid(variable~.,scales='free')

将每个箱形图堆叠在彼此之上,最后情节是不可读的,因为有16个箱图。因此,一个好主意是创建16个不同的箱图,每个度量标准一个。

我一直在寻找解决方案,一个是运行此代码:

tomelt<-data.frame(c(daily[1],daily[2],daily[3])) #create a data.frame with variable   name, date and the variable to be ploted. 

melted.df<-melt(tomelt,id.vars=c('name', 'date')) #convert to long form 
ggplot(melted.df,aes(x=name,y=value)) + geom_boxplot() #plot 

16次,每次更改代码以调用数据框的另一个度量标准(列)...但显然这根本没有效率。

您是否知道如何创建for循环来执行此操作?

2 个答案:

答案 0 :(得分:0)

这里有很多你似乎缺少的东西。首先,如果您有16个指标和50,000个观测值,每人10个观测值,您将获得80,000个箱图。也许你只对前几个人感兴趣。

您需要了解很多关于for循环的知识。你一定要找一本关于R的指南,先尝试一些基本的东西。

使用for循环,我认为你打算做这样的事情:

for(s in 3:ncol(mylist[[1]])) { 
  for(i in 1:length(mylist)){ 
    boxplot(mylist[[i]][s])
  }
}

但即使这样也行不通,每个情节都会覆盖最后一个,所以你必须把它放到一个par(mfrow=c(num.rows,num.cols))的网格中。但是有更好的选择。你应该看?boxplot,特别是例子;有很多例子适用于你的情况。另外,请考虑ggplot2。例如,尝试使用此代码,它将在没有for循环的情况下以行和列整齐地绘制数据。

# Stick your list together.
one.df<-do.call(rbind,mylist)
# Convert to "long-form".
library(reshape)
melted.df<-melt(one.df,id.vars=c('name','date'))
# Plot with ggplot2
ggplot(melted.df,aes(x=name,y=value)) + 
geom_boxplot() + facet_grid(variable~.,scales='free')

enter image description here

答案 1 :(得分:0)

我最近这样做了。我有一个数据框,我想将第3列到第10列作为y轴放在8个箱形图中的每一个对着第1列.df称为&#34;事件&#34;。 你必须每次使用相同的colnames创建一个新的数据框(&#34; boxdf&#34;),这是蹩脚的,但它可以工作:

for (g in 3:ncol(Event))
    {
        SaveBox = paste0("boxplot_",colnames(Event[g]),"_",g,".png")
        boxdf <- data.frame(Event$event_type,Event[g])
        colnames(boxdf) = c("event_type","ycol")
        boxplot(ycol~event_type,data=boxdf, main = colnames(Event[g]), xlab="type: 0:non-event, 1:event", ylab=colnames(Event[g]),col=c("blue","red")) #Event[g]
        dev.copy(png,SaveBox)
        dev.off()
        rm(boxdf)
    }

哦,它还将每个箱图保存到当前目录中。 保存行是:

 SaveBox = paste0("boxplot_",colnames(Event[g]),"_",g,".png")
 ...
 dev.copy(png,SaveBox)
            dev.off()