0

我有一个名为: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 循环来执行此操作有任何想法吗?

4

2 回答 2

1

您似乎在这里缺少很多东西。首先,如果您有 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')

在此处输入图像描述

于 2013-09-22T02:49:49.063 回答
0

我最近做了这个。我有一个数据框,我想将第 3 到第 10 列绘制为 8 个箱线图中每一个与第 1 列的 y 轴。df 称为“事件”。您必须每次使用相同的 colnames 制作一个新的数据框(“boxdf”),这很蹩脚,但它有效:

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()
于 2015-08-06T09:04:03.620 回答