retain(3f) - [M_datapac:VECTOR_OPERATION] retain all observations in a
vector within a user-specified interval
SUBROUTINE RETAIN(X,N,Xmin,Xmax,Newn)
RETAIN(3f) retains all observations in the REAL vector X which are
inside the closed (inclusive) interval defined by XMIN and XMAX,
while deleting all observations outside of this interval.
Thus all observations in X which are smaller than XMIN or larger
than XMAX are deleted from X. RETAIN(3f) (and the REPLAC and DELETE
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,
a trimmed sample can easily be constructed by use of RETAIN(3f).
X description of parameter
Y description of parameter
Sample program:
program demo_retain
use M_datapac, only : retain
implicit none
! call retain(x,y)
end program demo_retain
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 | ||||
integer | :: | Newn |
SUBROUTINE RETAIN(X,N,Xmin,Xmax,Newn) REAL(kind=wp) :: hold , pointl , pointu , X , Xmax , Xmin INTEGER :: i , k , N , ndel , Newn , newnp1 , nold ! ! 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 TO BE RETAINED. ! --XMAX = THE VALUE ! WHICH DEFINES THE UPPER LIMIT ! (INCLUSIVELY) OF THE PARTICULAR ! INTERVAL OF INTEREST TO BE RETAINED. ! OUTPUT ARGUMENTS--NEWN = THE INTEGER NUMBER OF OBSERVATIONS ! REMAINING (RETAINED) IN X AFTER ALL ! OF THE OBSERVATIONS OUTSIDE THE ! INTERVAL OF INTEREST HAVE BEEN ! DELETED. ! OUTPUT--THE VECTOR X ! IN WHICH ONLY THOSE VALUES INSIDE ! (INCLUSIVELY) THE INTERVAL OF INTEREST ! HAVE BEEN RETAINED, AND ! THE INTEGER VALUE NEWN ! WHICH GIVES THE NUMBER OF ! OBSERVATIONS RETAINED IN X. ! ALSO, 6 LINES OF SUMMARY INFORMATION ! WILL BE GENERATED INDICATING ! 1) WHAT THE INTERVAL OF INTEREST WAS; ! 2) HOW MANY OBSERVATIONS WERE DELETED; ! 3) WHAT THE OLD (ORIGINAL) SAMPLE SIZE WAS (N); ! 4) WHAT THE NEW SAMPLE SIZE IS (NEWN). ! PRINTING--YES. ! RESTRICTIONS--THERE IS NO RESTRICTION ON THE MAXIMUM VALUE ! OF N FOR THIS SUBROUTINE. ! MODE OF INTERNAL OPERATIONS--. ! COMMENT--IN THE END, AFTER THIS SUBROUTINE HAS ! MADE WHATEVER DELETIONS ARE APPROPRIATE, ! THE OUTPUT VECTOR X WILL BE 'PACKED'; ! THAT IS, NO 'HOLES' WILL EXIST IN THE ! VECTOR X--ALL OF THE RETAINED ELEMENTS ! OF X WILL BE PACKED INTO THE FIRST AVAILABLE ! LOCATIONS IN X, WHILE THE REMAINDER ! OF THE N LOCATIONS IN X WILL BE ZERO-FILLED. ! COMMENT--IN THE MAIN (CALLING) ROUTINE, IT IS ! PERMISSABLE (IF THE ANALYST SO DESIRES) ! TO USE THE SAME VARIABLE NAME ! IN THE FIFTH ARGUMENT AS USED IN THE SECOND ! ARGUMENT IN THE CALLING SEQUENCE TO THIS ! RETAIN SUBROUTINE--NO CONFLICT WILL RESULT ! IN THE INTERNAL OPERATION OF THE RETAIN ! SUBROUTINE. FOR EXAMPLE, IT IS PERMISSIBLE ! TO HAVE CALL RETAIN(X,N,-10.0,10.0,N) ! IN WHICH THE VARIABLE NAME N IS USED ! AS BOTH THE SECOND AND FIFTH ARGUMENTS. ! COMMENT--THIS IS ONE OF THE FEW SUBROUTINES IN DATAPAC ! IN WHICH THE INPUT VECTOR X IS ALTERED. ! !--------------------------------------------------------------------- ! 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 RETAIN(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 RETAIN(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 RETAIN(3f) has all elements =', & & E15.8,' *****') ENDIF ! !-----START POINT----------------------------------------------------- ! 50 continue pointl = Xmin pointu = Xmax IF ( Xmin>Xmax ) pointl = Xmax IF ( Xmin>Xmax ) pointu = Xmin nold = N k = 0 DO i = 1 , nold IF ( X(i)>=pointl .AND. X(i)<=pointu ) THEN k = k + 1 X(k) = X(i) ENDIF ENDDO Newn = k ndel = nold - Newn newnp1 = Newn + 1 IF ( newnp1<=nold ) THEN DO i = newnp1 , nold X(i) = 0.0_wp ENDDO ENDIF ! ! WRITE OUT A BRIEF SUMMARY ! WRITE(G_IO, "(' ')" ) WRITE(G_IO, "(' ','Output from the RETAIN subroutine--')" ) WRITE(G_IO, "(' ',7X,'Only observations between ',E15.8,' AND ', E15.8)" ) pointl , pointu WRITE(G_IO, "(' ',7X,'(inclusive) have been retained.')" ) WRITE(G_IO, "(' ',7X,'All observations outside of this interval')" ) WRITE(G_IO, "(' ',7X,'have been deleted.')" ) WRITE(G_IO, "(' ',7X,'The input number of observations (in X) is ', I0)") nold WRITE(G_IO, "(' ',7X,'The output number of observations (in X) is ', I0)") Newn WRITE(G_IO, "(' ',7X,'The number of observations deleted is ', I0)") ndel ENDIF END SUBROUTINE RETAIN