Rで、リストの中に含まれている時のみ回帰線を引きたい
Rでfor文を使って複数グラフを書くときに、特定の条件を満たすときのみ回帰線を引きたい。
想定している状況を、irisを用いて説明させてください。
library(ggplot2)
library(dplyr)
plotlist=NULL
splist=list("setosa")
for(i in unique(iris$Species)){
plotlist[[i]]=iris %>%
filter(Species==i) %>%
ggplot(aes(x=Sepal.Length, y=Sepal.Width))+
geom_point()+
labs(title=i)
}
grid.arrange(grobs=plotlist)
このようにすると、irisには3品種(setosa,versicolor,verginia)が含まれているので、品種ごとの3つのグラフが並んで出てきます(このことは以前の質問でご教示いただきました、ありがとうございます)。
ここでさらに、特定の品種、この場合はsetosaのみに回帰線を引きたいとします。
ここではirisを用いているのでこのような設定にしていますが、実際には別のところでglm()とかをして、p<0.05だったものだけを入れたリストとかを作ることを想定しています。
そこでまず考えたのが以下で、
plotlist=NULL
splist=c("setosa")
for(i in unique(iris$Species)){
plotlist[[i]]=iris %>%
filter(Species==i) %>%
ggplot(aes(x=Sepal.Length, y=Sepal.Width))+
geom_smooth(data=filter(iris, species %in% splist))+ #追加部分
geom_point()+
labs(title=i)
}
grid.arrange(grobs=plotlist)
としました。filterで、品種がlistに含まれている場合にgeom_smoothするようにしています。しかし、こうすると(よく考えると当然でしたが)setosa以外のグラフにもsetosaのデータを元にした回帰線が引っ張られてしまいます。
そこで次に試したのが
plotlist=NULL
splist=c("setosa")
for(i in unique(iris$Species)){
plotlist[[i]]=iris %>%
filter(Species==i) %>%
ggplot(aes(x=Sepal.Length, y=Sepal.Width))+
geom_point()+
labs(title=i)
if(unique(iris$Species)[i] %in% splist){
plotlist[[i]]=plotlist[[i]]+
geom_smooth(data=filter(iris,Species %in% splist))
}
}
grid.arrange(grobs=plotlist)
です。if文を書いて、後から回帰線を付け足そうとしています。しかし、これを実行してもどの品種のグラフにも回帰線は描画されずに出力されてしまいます。
unique(iris$Species)[1] %in% splist
を実行するとTRUEになってはいます。
また、for文の外で
plotlist[[1]]=plotlist[[1]]+
geom_smooth(data=filter(iris,Species %in% splist))
とするぶんにはうまく行くのですが、何がいけないのでしょうか。
初歩的な質問で申し訳ありませんが、よろしくお願いいたします。