RETAIN Subroutine

public subroutine RETAIN(X, N, Xmin, Xmax, Newn)

NAME

retain(3f) - [M_datapac:VECTOR_OPERATION] retain all observations in a
vector within a user-specified interval

SYNOPSIS

   SUBROUTINE RETAIN(X,N,Xmin,Xmax,Newn)

DESCRIPTION

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

OPTIONS

 X   description of parameter
 Y   description of parameter

EXAMPLES

Sample program:

program demo_retain
use M_datapac, only : retain
implicit none
! call retain(x,y)
end program demo_retain

Results:

AUTHOR

The original DATAPAC library was written by James Filliben of the
Statistical Engineering Division, National Institute of Standards
and Technology.

MAINTAINER

John Urban, 2022.05.31

LICENSE

CC0-1.0

Arguments

Type IntentOptional Attributes Name
real(kind=wp), dimension(:) :: X
integer :: N
real(kind=wp) :: Xmin
real(kind=wp) :: Xmax
integer :: Newn

Source Code

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