replac(3f) - [M_datapac:VECTOR_OPERATION] replace all observations
in a vector within a given interval with a user-specified constant
SUBROUTINE REPLAC(X,N,Xmin,Xmax,Xnew)
REPLAC(3f) replaces (with the value XNEW) all observations in the REAL
vector X which are inside the closed (inclusive) interval defined by
XMIN and XMAX.
All observations outside of this interval are left unchanged.
Thus all observations in X which are equal to or larger than XMIN
and equal to or smaller than XMAX, will be replaced by XNEW.
REPLAC(3f) (and the RETAIN(3f) and DELETE(3f) subroutines) gives
the data analyst the ability to easily 'clean up' a data set which
has missing and/or outlying observations so that a more appropriate
subsequent data analysis may be performed. For example, replacement
of an outlier with a more appropriate value can easily be done by
REPLAC(3f).
X description of parameter
Y description of parameter
Sample program:
program demo_replac
use M_datapac, only : replac
implicit none
! call replac(x,y)
end program demo_replac
Results:
The original DATAPAC library was written by James Filliben of the
Statistical Engineering Division, National Institute of Standards
and Technology.
John Urban, 2022.05.31
CC0-1.0
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=wp), | dimension(:) | :: | X | |||
integer | :: | N | ||||
real(kind=wp) | :: | Xmin | ||||
real(kind=wp) | :: | Xmax | ||||
real(kind=wp) | :: | Xnew |
SUBROUTINE REPLAC(X,N,Xmin,Xmax,Xnew) REAL(kind=wp) :: hold , pointl , pointu , X , Xmax , Xmin , Xnew INTEGER :: i , k , N , ndel ! ! INPUT ARGUMENTS--X = THE VECTOR OF ! (UNSORTED OR SORTED) OBSERVATIONS. ! --N = THE INTEGER NUMBER OF OBSERVATIONS ! IN THE VECTOR X. ! --XMIN = THE VALUE ! WHICH DEFINES THE LOWER LIMIT ! (INCLUSIVELY) OF THE PARTICULAR ! INTERVAL OF INTEREST FOR REPLACEMENT. ! --XMAX = THE VALUE ! WHICH DEFINES THE UPPER LIMIT ! (INCLUSIVELY) OF THE PARTICULAR ! INTERVAL OF INTEREST FOR REPLACEMENT. ! --XNEW = THE VALUE ! WITH WHICH ALL OF THE ! OBSERVATIONS IN THE INTERVAL ! OF INTEREST ! WILL BE REPLACED. ! OUTPUT--THE VECTOR X ! IN WHICH ONLY THOSE VALUES INSIDE ! (INCLUSIVELY) THE INTERVAL OF INTEREST ! HAVE BEEN REPLACED BY XNEW. ! ALSO, 6 LINES OF SUMMARY INFORMATION ! WILL BE GENERATED INDICATING ! 1) WHAT THE INTERVAL OF INTEREST WAS; ! 2) WHAT THE REPLACEMENT VALUE WAS; ! 3) HOW MANY OBSERVATIONS WERE REPLACED; ! 4) WHAT THE SAMPLE SIZE WAS (N); ! PRINTING--YES. ! RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE ! OF N FOR THIS SUBROUTINE. ! MODE OF INTERNAL OPERATIONS--. ! COMMENT--THIS SUBROUTINE MAY BE USEFULLY EMPLOYED ! IN CONJUNCTION WITH THE DATAPAC ! PLOTTING SUBROUTINES INASMUCH ! AS THE LATTER HAVE BEEN ! SET UP WITH THE CONVENTION ! THAT ALL VALUES IN THE VERTICAL AXIS ! VECTOR OR HORIZONTAL AXIS VECTOR ! WHICH ARE EQUAL TO OR IN EXCESS OF 10.0**10 ! WILL BE AUTOMATICALLY IGNORED ! IN THE PLOT (THAT IS, NOT PLOTTED). ! THIS CONVENTION GREATLY SIMPLIFIES THE PROBLEM ! OF PLOTTING WHEN SOME ELEMENTS IN THE VERTICAL ! OR HORIZONTAL AXIS VECTORS ! ARE 'MISSING DATA', OR WHEN WE PURPOSELY ! WANT TO IGNORE CERTAIN ELEMENTS IN THESE VECTORS ! FOR PLOTTING PURPOSES (THAT IS, WE DO NOT ! WANT CERTAIN ELEMENTS TO BE PLOTTED). ! TO CAUSE SPECIFIC ELEMENTS IN THE VERTICAL ! OR HORIZONTAL AXIS VECTORS TO BE ! IGNORED, WE REPLACE THE ELEMENTS BEFOREHAND ! (BY USE OF THE REPLAC SUBROUTINE) ! BY SOME LARGE VALUE (LIKE, SAY, 10.0**10) AND ! THEY WILL SUBSEQUENTLY BE IGNORED IN THE PLOTTING ! SUBROUTINES. ! COMMENT--THIS IS ONE OF THE FEW SUBRUTINES IN DATAPAC ! IN WHICH THE INPUT VECTOR X IS ALTERED. ! ORIGINAL VERSION--NOVEMBER 1972. ! UPDATED --NOVEMBER 1975. ! !--------------------------------------------------------------------- ! DIMENSION X(:) ! ! CHECK THE INPUT ARGUMENTS FOR ERRORS ! IF ( N<1 ) THEN WRITE (G_IO,99001) 99001 FORMAT (' ***** FATAL ERROR--The second input argument to REPLAC(3f) is non-positive *****') WRITE (G_IO,99002) N 99002 FORMAT (' ','***** The value of the argument is ',I0,' *****') RETURN ELSE IF ( N==1 ) THEN WRITE (G_IO,99003) 99003 FORMAT (' ***** NON-FATAL DIAGNOSTIC--The second input argument to REPLAC(3f) has the value 1 *****') ELSE hold = X(1) DO i = 2 , N IF ( X(i)/=hold ) GOTO 50 ENDDO WRITE (G_IO,99004) hold 99004 FORMAT (' ***** NON-FATAL DIAGNOSTIC--The first input argument (a vector) to REPLAC(3f) has all elements =',& & E15.8,' *****') ENDIF ! !-----START POINT----------------------------------------------------- ! 50 pointl = Xmin pointu = Xmax IF ( Xmin>Xmax ) pointl = Xmax IF ( Xmin>Xmax ) pointu = Xmin ! k = 0 DO i = 1 , N IF ( X(i)>=pointl .AND. X(i)<=pointu ) THEN k = k + 1 X(i) = Xnew ENDIF ENDDO ndel = N - k ! ! WRITE OUT A BRIEF SUMMARY ! WRITE (G_IO,99005) 99005 FORMAT (' ') WRITE (G_IO,99006) 99006 FORMAT (' ','output from the REPLAC subroutine--') WRITE (G_IO,99007) pointl , pointu 99007 FORMAT (' ',7X,'only observations between ',E15.8,' and ', E15.8) WRITE (G_IO,99008) 99008 FORMAT (' ',7X,'(inclusive) have been replaced.') WRITE (G_IO,99009) 99009 FORMAT (' ',7X,'all observations outside of this interval') WRITE (G_IO,99010) 99010 FORMAT (' ',7X,'have been left unchanged.') WRITE (G_IO,99011) Xnew 99011 FORMAT (' ',7X,'The replacement value is ',E15.8) WRITE (G_IO,99012) N 99012 FORMAT (' ',7X,'The input number of observations is ',I0) WRITE (G_IO,99013) k 99013 FORMAT (' ',7X,'The number of observations replaced is ',I0) WRITE (G_IO,99014) ndel 99014 FORMAT (' ',7X,'The number of observations unchanged is ',I0) ENDIF ! END SUBROUTINE REPLAC