```Date: Thu, 3 Mar 2005 15:13:16 +0000 Reply-To: toby dunn Sender: "SAS(r) Discussion" From: toby dunn Subject: Re: Tricky conditional execution of do block Comments: To: murff@byu.edu In-Reply-To: Content-Type: text/plain; format=flowed Mike, Glad I could help, but I wouldn't be too embarressed I am the strike out king as Ron puts, but the more mistakes we make the more we learn. SAS-L the place where the SAS giants walk and the best SAS school around.... Toby Dunn From: "Michael Murff" Reply-To: To: "'toby dunn'" CC: Subject: RE: Tricky conditional execution of do block Date: Thu, 3 Mar 2005 08:06:55 -0700 Okay, now I see. I have used Boolean logic before but I always put a space such as not (var ge 100), which evaluates to one if true. The proximity of the () was a style feature I've never seen. I could be embarrassed by my mistake (again) but I'm having too much fun learning from you guys. Thanks for the clarification, Toby. Michael Murff -----Original Message----- From: toby dunn [mailto:tobydunn@hotmail.com] Sent: Thursday, March 03, 2005 7:15 AM To: mjm33@MSM1.BYU.EDU Subject: Re: Tricky conditional execution of do block Mike, the use of not() below is not a function but a operator, which is used in comparisions. I found this in the online docs thought you might be interested. Logical (Boolean) Operators and Expressions Logical operators, also called Boolean operators, are usually used in expressions to link sequences of comparisons. The logical operators are shown in the following table: Logical Operators Symbol Mnemonic Equivalent Example & AND (a>b & c>d) | OR (table note 1) (a>b or c>d) ! OR ¦ OR ¬ NOT (table note 2) not(a>b) ˆ NOT ~ NOT TABLE NOTE 1: The symbol you use for OR depends on your operating environment. TABLE NOTE 2: The symbol you use for NOT depends on your operating environment. See Order of Evaluation in Compound Expressions for the order in which SAS evaluates these operators. In addition, a numeric expression without any logical operators can serve as a Boolean expression. For an example of Boolean numeric expressions, see Boolean Numeric Expressions. ---------------------------------------------------------------------------- ---- The AND Operator If both of the quantities linked by AND are 1 (true), then the result of the AND operation is 1; otherwise, the result is 0. For example, in the following comparison: a0 the result is true (has a value of 1) only when both A0 are 1 (true): that is, when A is less than B and C is positive. Two comparisons with a common variable linked by AND can be condensed with an implied AND. For example, the following two subsetting IF statements produce the same result: if 16<=age and age<=65; if 16<=age<=65; ---------------------------------------------------------------------------- ---- The OR Operator If either of the quantities linked by an OR is 1 (true), then the result of the OR operation is 1 (true); otherwise, the OR operation produces a 0. For example, consider the following comparison: a0 The result is true (with a value of 1) when A0 is 1 (true), regardless of the values of A and B. Therefore, it is true when either or both of those relationships hold. Be careful when using the OR operator with a series of comparisons (in an IF, SELECT, or WHERE statement, for instance). Remember that only one comparison in a series of OR comparisons must be true to make a condition true, and any nonzero, nonmissing constant is always evaluated as true (see Boolean Numeric Expressions). Therefore, the following subsetting IF statement is always true: if x=1 or 2; SAS first evaluates X=1, and the result can be either true or false; however, since the 2 is evaluated as nonzero and nonmissing (true), the entire expression is true. In this statement, however, the condition is not necessarily true because either comparison can evaluate as true or false: if x=1 or x=2; ---------------------------------------------------------------------------- ---- The NOT Operator The prefix operator NOT is also a logical operator. The result of putting NOT in front of a quantity whose value is 0 (false) is 1 (true). That is, the result of negating a false statement is 1 (true). For example, if X=Y is 0 (false) then NOT(X=Y) is 1 (true). The result of NOT in front of a quantity whose value is missing is also 1 (true). The result of NOT in front of a quantity with a nonzero, nonmissing value is 0 (false). That is, the result of negating a true statement is 0 (false). For example, the following two expressions are equivalent: not(name='SMITH') name ne 'SMITH' Furthermore, NOT(A&B) is equivalent to NOT A|NOT B, and NOT(A|B) is the same as NOT A & NOT B. For example, the following two expressions are equivalent: not(a=b & c>d) a ne b | c le d ---------------------------------------------------------------------------- ---- Boolean Numeric Expressions In computing terms, a value of true is a 1 and a value of false is a 0. In SAS, any numeric value other than 0 or missing is true, and a value of 0 or missing is false. Therefore, a numeric variable or expression can stand alone in a condition. If its value is a number other than 0 or missing, the condition is true; if its value is 0 or missing, the condition is false. 0 | . = False 1 = True For example, suppose that you want to fill in variable REMARKS depending on whether the value of COST is present for a given observation. You can write the IF-THEN statement as follows: if cost then remarks='Ready to budget'; This statement is equivalent to: if cost ne . and cost ne 0 then remarks='Ready to budget'; A numeric expression can be simply a numeric constant, as follows: if 5 then do; The numeric value that is returned by a function is also a valid numeric expression: if index(address,'Avenue') then do; Toby Dunn From: Michael Murff Reply-To: Michael Murff To: SAS-L@LISTSERV.UGA.EDU Subject: Re: Tricky conditional execution of do block Date: Wed, 2 Mar 2005 23:33:52 -0700 MIME-Version: 1.0 Received: from malibu.cc.uga.edu ([128.192.1.103]) by MC6-F36.hotmail.com with Microsoft SMTPSVC(6.0.3790.211); Wed, 2 Mar 2005 22:34:20 -0800 Received: from listserv.cc.uga.edu (128.192.1.75) by malibu.cc.uga.edu (LSMTP for Windows NT v1.1b) with SMTP id <0.00E8D403@malibu.cc.uga.edu>; Thu, 3 Mar 2005 1:34:20 -0500 Received: from LISTSERV.UGA.EDU by LISTSERV.UGA.EDU (LISTSERV-TCP/IP release 1.8d) with spool id 394629 for SAS-L@LISTSERV.UGA.EDU; Thu, 3 Mar 2005 01:34:21 -0500 Received: from Msm1.byu.edu (msm1.byu.edu [128.187.144.245]) by listserv.cc.uga.edu (8.12.11/8.12.11) with ESMTP id j236YKPP030528 for ; Thu, 3 Mar 2005 01:34:20 -0500 Received: from msm-MTA by Msm1.byu.edu with Novell_GroupWise; Wed, 02 Mar 2005 23:34:20 -0700 X-Message-Info: ZLIeWzn802Qy/ZeVrPvEPfLhx8CMfIbB+rElzvwhsgY= X-Mailer: Novell GroupWise Internet Agent 6.5.1 Newsgroups: bit.listserv.sas-l Comments: To: nospam@HOWLES.COM Return-Path: owner-sas-l@LISTSERV.UGA.EDU X-OriginalArrivalTime: 03 Mar 2005 06:34:20.0446 (UTC) FILETIME=[080ECBE0:01C51FBB] Howard et al., My second primer in retain in as many days (thanks Dennis). I have to say that this one took a few hours to sink in. I had never seen the likes of the not() function (in SAS) and coundnt' find it in the official online SAS docs(9.1.3), nor was it in Cody's functions text. I have to say that I laughed out loud when I tested the following code (trivial extension). data _null_; x=1; y=0; if not not(x) then put "x=" x; if not(y) then put "y=" y; run; Howard's trick will do the trick for this "tricky" post. All the best, Michael Murff PS--I googled for "SAS boolean functions" and came up blank. Are there others of the same ilk as not() e.g. boolean and / or (no pun intended :-) undocumented? My guess is that this function may have been documented in an earlier version of SAS. >>> "Howard Schreier " 03/02/05 3:11 PM >>> Since Michael's data set is sorted on VAR, the extra step and extra pass are avoidable. Try this: data test; input var @@; cards; 5 26 26 27 28 ; data _null_; set test; retain found252627 0; if var in (25,26,27) and not(found252627) then found252627 = var; if var=found252627 then put _all_; run; I get: var=26 found252627=26 _ERROR_=0 _N_=2 var=26 found252627=26 _ERROR_=0 _N_=3 On Wed, 2 Mar 2005 09:31:56 -0800, Dennis Diskin wrote: >Michael, > >There are a number of ways to do this, but I prefer: > >proc sql noprint; >select min(var) into :minvar from yourdata where 25 <= var <= 27; >Quit; > >And then use &minvar in your if statement. > >HTH, >Dennis Diskin > > >Michael Murff wrote: >Hi SAS-L, > > > >I have a dataset sorted on variable, VAR, whose values range from 1-100. I >want to execute a do block for the all observations were VAR is less than or >equal to the smallest value in the range of 25-27. So if 25 exists I only >want to execute the do block for the records having VAR le 25. But if 25 >does not exist then I want to execute the DO block on all records where VAR >le 26 or 27, whatever the smallest in the dataset may be. This seems to me >to be a rather difficult thing to code in logically. I could come up with >some kind of flagging scheme, I guess, and process the datasets before hand >and then condition on those flags, but _seems_ like something like this >could be done in a DO UNTIL or DO WHILE or DO BLOCK. > > > >Thanks for your patience with me, > > > >Michael Murff > >Provo, UT ```

Back to: Top of message | Previous page | Main SAS-L page