最初に、2 つのベクトル (データのサブセット) から始めます。両方で ecdf を実行し、比較しやすいように同じプロットにプロットします。それはすべて問題ありませんが、知っておく必要があるのは、関数を任意のベクトルのペアに対して普遍的に機能させる方法です。そのため、ベクトルを入力するだけで関数が機能します。大きなベクトルを 2 番目に呼び出す場合と同様に、データが失われないように、呼び出された順序に関係なく、プロットの軸を大きなベクトルに合わせて自動的にスケーリングする必要があります。
念のため、虹彩データを使用するためのセットアップを含めました。
data=iris
virg<-subset(iris, iris$Species=="virginica"); virg
virg_pl<-virg$Petal.Length; virg_pl
versi<-subset(iris, iris$Species=="versicolor"); versi
versi_pl<-versi$Petal.Length; versi_pl
ここに私が持っているものがあります:
twoecdfsoner<-function(x,y,z){
ecdf1<-ecdf(x)
ecdf2<-ecdf(y)
plot(ecdf1,xlab=head(z,n=1),
ylab="cumulative relative frequency",
lty=1,pch=".",
main="",
do.point=FALSE,
verticals=TRUE,xlim=c(min (y),max (x)))
plot(ecdf2,verticals=TRUE,
do.points=FALSE,
lty=3,pch=".",
add=TRUE, xlim=c(min (y),max (x)))
legend("right","center",
legend=c(deparse(substitute(x)),
deparse(substitute(y))),
lty=c(1,3),cex=0.8)
}
twoecdfsoner(virg_pl,versi_pl,"inches")
条件付きステートメントを記述できるようですが、次のエラーが発生します。
Warning messages:
1: In x > y :
longer object length is not a multiple of shorter object length
2: In x > y :
longer object length is not a multiple of shorter object length
3: In x > y :
longer object length is not a multiple of shorter object length
これまで私は試しました
xlim=c(min (y),max (x)))
xlim=range(c(x),c(y)
xlim=pmax(x,y)
と条件文を書く
また、実線でその大きなベクトルをコーディングしたいと思います。誰かが何か提案があれば、それは大歓迎です。
@ 42-少し読んだ後、条件文を実行できると思いましたが、これも機能するようです。この方法でコードを実行することについて何か批判はありますか?
twoecdfsoner<-function(x,y,z){
ecdf_1 <- plot(ecdf(x),
verticals=TRUE,
pch=".",
main="",
do.points=FALSE,
lty=ifelse(max(x)>max(y), c(1), c(3)),
xlab=head(z,n=1),
ylab="Cumulative relative frequency",
xlim=range(x,y))
ecdf_2 <- lines(ecdf(y),
verticals=TRUE,
do.points=FALSE,
lty=ifelse(max(y)>max(x), c(1), c(3)),
pch=".")
legend_text<-
if (max(x)>max(y)){
legend=c(deparse(substitute(x)), deparse(substitute(y)))
} else {max(y)>max(x)
legend=c(deparse(substitute(y)), deparse(substitute(x)))
}
legend("right",
legend=legend_text,
lty=c(1,3))
}
twoecdfsoner(virg_pl,versi_pl,"inches")