我是R的新手。我已经想出了如何在我的数据帧的子集上绘制qqnorm
图。但是,我想在由两个因子定义的子集上绘制qqnorm
图(一个因子有48个类别(brain_region),每个类别可以进一步细分为另一个因子,它有三个级别(GroupID) )。我尝试过以下方法:
by(t, t[,"GroupID"], function(x) tapply(t$FA,t$brain_region,qqnorm))
但它似乎没有用。我也不确定这是否是最好的方法,因为我是这个程序的新手。
我还想保存每个单独生成的qqnorm
图,其中x轴标记为“FA”,标题具有两个因子(脑区域/ GroupID)中每一个的特定级别。非常感谢您的帮助。
答案 0 :(得分:1)
绘图是apply
不是最佳解决方案的少数事情之一。 ggplot
为您提供了足够的可能性,如in this answer所示。
一次性绘制所有级别
如果您使用基础图,则可以更好地使用for
循环。另外,如果您想在同一图形设备上绘制不同的图表,可以使用例如par(mfrow=)
或layout
(请参阅帮助页?layout
)
我们以内置数据集iris
为例:
data(iris)
op <- par(mfrow=c(1,3))
for(i in levels(iris$Species)){
tmp <- with(iris, Petal.Width[Species==i])
qqnorm(tmp,xlab="Petal.Width",main=i)
qqline(tmp)
}
par(op)
rm(i,tmp)
给出:
使用for
循环后,请不要忘记清理工作区。不是强制性的,但它可以防止以后的严重混淆。
结合两个因素
为了同时为2个因子级别完成此操作,您可以构建嵌套的for
- 循环,或将两个因子组合成单个因子。拿数据集mtcars:
data(mtcars)
mtcars$cyl <- factor(mtcars$cyl)
mtcars$am <- factor(mtcars$am,
labels=c('automatic','manual'))
要结合这两个级别,您可以使用这个简单的结构:
mtcars$combined <- factor(paste(mtcars$cyl,mtcars$am,sep='/'))
然后再做同样的事情。使用两个for
循环,您的代码就像下面的代码一样。请注意,这只有在您拥有每个因素组合的数据时才有效,并且您没有太多级别。如果您有很多级别,最好使用例如png()
(请参阅?png
获取信息)保存图表,而不是将它们全部绘制在同一图形设备上。
lcyl <- levels(mtcars$cyl)
lam <- levels(mtcars$am)
par(mfrow=c(length(lam),length(lcyl)))
for(i in lam){
for(j in lcyl){
tmp <- with(mtcars,mpg[am==i & cyl==j])
qqnorm(tmp,xlab="Petal.Width",
main=paste(i,j,sep="/"))
qqline(tmp)
}
}
给出: