2017-10-07 12 views
2

처음에는 2 개의 벡터 (내 데이터의 부분 집합)로 시작합니다. 나는 둘 모두에서 ecdf를 실행하여 비교를 쉽게하기 위해 같은 줄거리에 그려 봅니다. 모든 것은 괜찮지 만 내가 알아야 할 것은 모든 벡터 쌍에 대해 보편적으로 함수를 작동시키는 방법입니다. 따라서 벡터에 입력하면 함수가 작동합니다. 큰 벡터를 두 번째 호출하는 경우처럼 데이터가 손실되지 않도록 호출 된 순서에 관계없이 플롯의 축이 큰 벡터에 대해 자동으로 확장되도록하고 싶습니다.R에서 비교할 두 개의 Ecd 파일을 플로팅 할 때 축을 큰 벡터로 축척하려면 어떻게해야합니까?

홍채 데이터를 사용할 수 있도록 설정을 포함 시켰습니다. 여기

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) 

및 쓰기 조건 ional statements

그 더 큰 벡터를 실선으로 작성하고 싶습니다. 누구든지 어떤 제안이라면 크게 감사 할 것입니다.

@ 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") 
+0

코드를 실행할 때 오류가 발생하지 않습니다. – G5W

+0

@ G5W : 처음 2 개의 인수를 뒤집어보십시오. –

+0

@ 42 알겠습니다. 오류는 없지만 그래프의 크기가 잘못 조정되었습니다. 알았다. – G5W

답변

1

ecdf에 문제가 있습니다 ... 환경에서 "x"인수를 숨 깁니다. 초보자는 그들을 찾을 수 없습니다. 이 시점에서

> ecdf(versi$Petal.Length) 
Empirical CDF 
Call: ecdf(versi$Petal.Length) 
x[1:19] =  3, 3.3, 3.5, ...,  5, 5.1 
> str(ecdf(versi$Petal.Length)) 
function (v) 
- attr(*, "class")= chr [1:3] "ecdf" "stepfun" "function" 
- attr(*, "call")= language ecdf(versi$Petal.Length) 

는 도움말 페이지의 모든 예제 실행하는 데 유익 할 것입니다 : 그래서 min 및/또는 max과를 도출하기 위해 노력하고, 결과가 function입니다

?ecdf # and probably also look at ?stepfun 

공지 것을을 인수가 항상 실패하지 않습니다. ecdf (아래 참조)의 환경에 액세스하는 방법을 찾았 으면 하나는 분을, 다른 하나는 최대가 있다고 가정하기보다는 두 벡터의 연결된 값의 분을 원할 것입니다. 다음은 ecdf 함수의 환경에있는 내용입니다.

ls(environment(ecdf(versi_pl))) 
[1] "f"  "method" "nobs" "x"  "y"  "yleft" "yright" 

twoecdfsoner<-function(x,y,z){ 
     ecdf1<-ecdf(x); 
     x1 <- environment(ecdf1)$x 
     ecdf2<-ecdf(y); 
     x2 <- environment(ecdf2)$x 
    plot(ecdf1,xlab=head(z,n=1), 
     ylab="cumulative relative frequency", 
     lty=1,pch=".", 
     main="", 
     do.point=FALSE, 
     verticals=TRUE,xlim=c(min (c(x1,x2)),max (c(x1,x2)))) 

    plot(ecdf2,verticals=TRUE, 
     do.points=FALSE, 
     lty=3,pch=".", 
     add=TRUE, xlim=c(min (c(x1,x2)), max (c(x1,x2)))) 

    legend("right","center", 
    legend=c(deparse(substitute(x)), 
     deparse(substitute(y))), 
     lty=c(1,3),cex=0.8) 
    } 
    twoecdfsoner(versi_pl, virg_pl,"inches")