我有一组看起来像这样的数据,
species<-"ABC" ind<-rep(1:4,each=24) hour<-rep(seq(0,23,by=1),4) depth<-runif(length(ind),1,50) df<-data.frame(cbind(species,ind,hour,depth)) df$depth<-as.numeric(df$depth)
在这个例子中,列&#34; ind&#34;有更多的级别,他们不总是相同的长度(这里每个人有4个级别,但实际上有些人有数千行数据,而其他只有几行)。
我想要做的是设置一个外部循环或函数来选择每个人的所有行(&#34; ind&#34;)并使用深度/小时列生成一个箱线图。
这是我想到的想法,
for (i in 1:length(unique(df$ind))){ data<-df[df$ind==df$ind[i],] individual[i]<-data plot.boxplot<-function(data){ boxplot(depth~hour,dat=data,xlab="Hour of day",ylab="Depth (m)") } } par(mfrow=c(2,2),mar=c(5,4,3,1)) plot.boxplot(individual)
我意识到这个循环可能不合适,但我还在学习。我可以一次为每个人做箱形图,但我想更快,更有效地为每个人选择数据并创建或存储箱图结果。当我有更多的人(而不是一次做一个人)时,这将非常有用。非常感谢。
答案 0 :(得分:2)
这样的事情怎么样?
par(mfrow=c(2,2))
invisible(
by(df,df$ind,
function(x)
boxplot(depth~hour,data=x,xlab="Hour of day",ylab="Depth (m)")
)
)
为了提供一些解释,这会针对boxplot
定义df
by
中的每组案例运行df$ind
。 invisible
包装器只是使得boxplot
使用的一堆输出不会写入控制台。