pyotr
@pyotr

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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))

とするぶんにはうまく行くのですが、何がいけないのでしょうか。
初歩的な質問で申し訳ありませんが、よろしくお願いいたします。

1

1Answer

if(unique(iris$Species)[i] %in% splist)ではなくif(i %in% splist)かと思います。iが品種を表す文字列になっているはずです。

0Like

Comments

  1. @pyotr

    Questioner

    コメントありがとうございます。お教えいただいた方法で解決いたしました。
    確かにおっしゃる通りでこの場合はiには文字列が入っていますね。
    自分で書いておいてなんですが、見たことのあるコードを見よう見まねで使っていて、理解できていませんでした。

Your answer might help someone💌