|
|||
|
Toby989,
Get rid of all that blah blah Antiquated SAS Macro Language blah and get your blah blah tail blah blah in gear and blah blah blah SAS Component Language. These kinds of problems NEVER occur with SAS Component Language and only complete blah blah blahs still continue to not only blah but they also continue to recommend it to blah blah blah newbys. Conditional execution of ANY SAS Statements. including MERGE, SET, UPDATE and MODIFY are never a problem when using SAS Component Language because blah blah blah. So abandon the Antiquated Macro Language while you still have a job and blah blah blah using SAS Component Language. Do it for your children. Blah blah blah, Joe On 9/1/06, toby989@hotpop.com <toby989@hotpop.com> wrote: > Hi Toby > > > > The c dataset looks like: > > _name_ f1 f2 f3 > q01 1 0 0 > q02 1 0 0 > q07 1 0 0 > q03 0 1 0 > q04 0 1 0 > q06 0 1 0 > q05 0 0 1 > > and the q's are variables in the ps2004ms dataset. > > And my macro that now works only partially looks like: > > > > %macro efamac(n=,m=,p=,r=,i=); > %do ix=1 %to &n; > proc sql; > select trim(left(_name_)) into :lista separated by ' ' from c where f&ix=1; > quit; > proc corr data=psdata.ps2004ms(where=(id<200 and id not in (49, 109) and > half=0)) alpha nocorr nosimple outp=outcal(where=(_type_='STDALPHA')); > var &lista ; > run; > proc transpose data=outcal(drop=_type_ _name_) out=outcal(drop=_name_); run; > proc sql; > insert into outc set _type_='STAT', _name_='STDALPHA', &m&n&p&r=(select distinct > col1 from outcal); > quit; > %end; > data y; > %sysfunc(ifc(&i=1, set outc, merge y outc)); > attrib _all_ label=''; > run; > %mend; > > data _null_; > i=1; > do n=' 3'; > do m='a'; > do p='a'; > do r='n', 'q', 'v'; > call execute('%efamac(n='||n||',m='||m||',p='||p||',r=' ||r||',i='||i||')'); > i=i+1; > end; > end; > end; > end; > run; > > > Some of the log file: The issue is where my macro variable suddenly becomes > listed twice, and three times, and 4 times if I my 'to' value of the loop would > be 4 and so on. > > > > > trim(left(_name_)) into :lista separated by ' ' from c where f3=1; > 17 + > quit; > NOTE: PROCEDURE SQL used (Total process time): > real time 0.00 seconds > cpu time 0.00 seconds > > > 17 + > proc corr data=psdata.ps2004ms(where=(id<200 and id not in (49, 109) and half=0)) > 18 + alpha nocorr nosimple outp=outcal(where=(_type_='STDALPHA')); var &lista > &lista &lista ; > run; proc transpose data=outcal(drop=_type_ _name_) out=outcal(drop=_name_); > run; proc sql; insert > into outc set _type_='STAT', _name_='STDALPHA', a3an=(select > > WARNING: Variable q10 already exists on file WORK.OUTCAL. > WARNING: Variable q18 already exists on file WORK.OUTCAL. > WARNING: Variable q20 already exists on file WORK.OUTCAL. > WARNING: Variable q23 already exists on file WORK.OUTCAL. > WARNING: Variable q26 already exists on file WORK.OUTCAL. > WARNING: Variable q31 already exists on file WORK.OUTCAL. > WARNING: Variable q10 already exists on file WORK.OUTCAL. > WARNING: Variable q18 already exists on file WORK.OUTCAL. > WARNING: Variable q20 already exists on file WORK.OUTCAL. > WARNING: Variable q23 already exists on file WORK.OUTCAL. > WARNING: Variable q26 already exists on file WORK.OUTCAL. > WARNING: Variable q31 already exists on file WORK.OUTCAL. > WARNING: Cronbach's Alpha has been computed with missing values present. Using > the NOMISS option is > recommended. > NOTE: The data set WORK.OUTCAL has 1 observations and 8 variables. > NOTE: PROCEDURE CORR used (Total process time): > real time 0.15 seconds > cpu time 0.15 seconds > > > > NOTE: There were 1 observations read from the data set WORK.OUTCAL. > NOTE: The data set WORK.OUTCAL has 6 observations and 1 variables. > NOTE: PROCEDURE TRANSPOSE used (Total process time): > real time 0.03 seconds > cpu time 0.03 seconds > > > 19 + distinct col1 from outcal); > NOTE: 1 row was inserted into WORK.OUTC. > > 19 + quit; > NOTE: PROCEDURE SQL used (Total process time): > real time 0.01 seconds > cpu time 0.01 seconds > > > 19 + data y; set outc; attrib _all_ label=''; > run; > > NOTE: There were 37 observations read from the data set WORK.OUTC. > NOTE: The data set WORK.Y has 37 observations and 3 variables. > NOTE: DATA statement used (Total process time): > real time 0.01 seconds > cpu time 0.01 seconds > > > > Toby > > > > > > > > > toby dunn wrote: > > Toby , > > > > I would look at your macro code. I tested the code out in two different > > macro set ups and it always seems to work just fine for me. > > > > > > > > Toby Dunn > > > > When everything is coming at you all at once, your in the wrong lane. > > > > A truly happy person is someone who can smile and enjoy the scenery on a > > detour. > > > > > > > > > > > > From: toby989@HOTPOP.COM > > Reply-To: toby989@HOTPOP.COM > > To: SAS-L@LISTSERV.UGA.EDU > > Subject: Re: exist function question > > Date: Thu, 31 Aug 2006 19:47:57 -0700 > > > > Toby > > > > The error, I know, just for testing purposes, to see what the > > sysfunc(exist(y)) > > returns. > > > > Your example works on my side too. > > > > .... > > > > Can it be, since my thing is part of a macro, that when I compile the macro > > the > > sysfuncs are evaluated and the datastep is created/set in stone. The > > datastep is > > not dynamically recreated everytime I call the macro......tested it, seems > > not > > to be the case. > > > > Toby > > > > > > > > toby dunn wrote: > > > >>Toby , > >> > >>data y ; > >>%sysfunc(exist(y)) ; > >>run ; > >> > >> > >>Is always gonna give you an error, why well consider what the resulting > >>data > >>step code will look like: > >> > >>If Data Set Y exists: > >> > >>Data Y ; > >>1 > >>Run ; > >> > >>And If it doesnt exists: > >> > >>Data Y ; > >>0 > >>Run ; > >> > >>Either way you just have a number sitting out there all alone in the night > >>with no context to help SAS figure out what you are doing. > >> > >> > >> > >>data y; > >>%sysfunc(ifc(%sysfunc(exist(y)),merge y outcfa,set outcfa)); > >>run; > >> > >>Works just as Howard advertised it too work just read your log: > >> > >>NOTE: There were 34 observations read from the data set WORK.Y. > >>NOTE: There were 34 observations read from the data set WORK.OUTCFA. > >>NOTE: The data set WORK.Y has 34 observations and 3 variables. > >>NOTE: DATA statement used (Total process time): > >> real time 0.01 seconds > >> cpu time 0.01 seconds > >> > >>Notice that it found data set Y and reads observation from both and merges > >>them however you have no by statement. Which may or may not cause you > >>problems. > >> > >> > >>Data Y ; > >>X = 'A' ; > >>Y = '1' ; > >>Output ; > >> > >>X = 'B' ; > >>Y = '2' ; > >>Output ; > >> > >>X = 'C' ; > >>Y = '3' ; > >>Output ; > >> > >>Run ; > >> > >> > >>Data X ; > >>X = 'A' ; > >>Z = '999' ; > >>Output ; > >> > >>X = 'C' ; > >>Z = '999' ; > >>Output ; > >> > >>Run ; > >> > >> > >>Data Y ; > >>%SysFunc( IfC( %SysFunc( Exist( Y ) ) , Merge Y X %Str( ; ) By X %Str( ; ) > >>, > >>Set X %Str( ; ) ) ) ; > >>Run ; > >> > >>Proc Print > >>Data = Y ; > >>Run ; > >> > >> > >> > >>Toby Dunn > >> > >>When everything is coming at you all at once, your in the wrong lane. > >> > >>A truly happy person is someone who can smile and enjoy the scenery on a > >>detour. > >> > >> > >> > >> > >> > >>From: toby989@HOTPOP.COM > >>Reply-To: toby989@HOTPOP.COM > >>To: SAS-L@LISTSERV.UGA.EDU > >>Subject: Re: exist function question > >>Date: Thu, 31 Aug 2006 16:11:13 -0700 > >> > >>Howard Schreier <hs AT dc-sug DOT org> wrote: > >> > >> > >>>On Wed, 30 Aug 2006 14:40:13 -0700, toby989@HOTPOP.COM wrote: > >>> > >>> > >>> > >>> > >>>>do I miss somehting here? > >>> > >>> > >>>Yes, if you were expecting a different outcome. > >>> > >>>Remember that the DATA step examines the headers of all input data sets > >>>(those named on SET, MERGE, UPDATE, and MODIFY statements) at compile > >>>time. > >>> > >>>Try this: > >>> > >>> data y; > >>> %sysfunc(ifc(%sysfunc(exist(y)),merge y outcfa,set outcfa)); > >>> run; > >>> > >> > >>Thank you. This is very helpful. the %sysfunc(exist(y)) returns '1' as can > >>be > >>seen below. But the %sysfunc(ifc(...)) does not take it somehow. > >> > >>76 data y; > >>77 %sysfunc(exist(y)); > >>NOTE: Line generated by the macro function "SYSFUNC". > >>1 1 > >> - > >> 180 > >>ERROR 180-322: Statement is not valid or it is used out of proper order. > >> > >>78 run; > >> > >>NOTE: The SAS System stopped processing this step because of errors. > >>WARNING: The data set WORK.Y may be incomplete. When this step was stopped > >>there were 0 > >> observations and 0 variables. > >>WARNING: Data set WORK.Y was not replaced because this step was stopped. > >>NOTE: DATA statement used (Total process time): > >> real time 0.01 seconds > >> cpu time 0.01 seconds > >> > >> > >> > >> > >>It only performs the 'set' command. > >> > >>79 data y; > >>80 %sysfunc(ifc(%sysfunc(exist(y)),merge y outcfa,set outcfa)); > >>81 run; > >> > >>NOTE: There were 34 observations read from the data set WORK.Y. > >>NOTE: There were 34 observations read from the data set WORK.OUTCFA. > >>NOTE: The data set WORK.Y has 34 observations and 3 variables. > >>NOTE: DATA statement used (Total process time): > >> real time 0.01 seconds > >> cpu time 0.01 seconds > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >>>>data y; if (exist('y')) then merge y outcfa; else set outcfa; run; > >>>>ERROR: File WORK.Y.DATA does not exist. > >>>> > >>>>NOTE: The SAS System stopped processing this step because of errors. > >>>>WARNING: The data set WORK.Y may be incomplete. When this step was > >>>>stopped > >>>>there were 0 > >>>> observations and 3 variables. > >>>>NOTE: DATA statement used (Total process time): > >>>> real time 0.01 seconds > >>>> cpu time 0.01 seconds > -- To paraphrase G. Santayana, the SAS Macro Facility used by common SAS programmers is an old mate that gives no pleasure and many headaches, yet she/he cannot live without it, and resents any aspersions that strangers may cast on its character |
|
|
||||
|
||||
|
|
|
|||
|
Scrap SAS altogether? I would do that if you recommend. For my children!
T Joe Whitehurst wrote: > Toby989, > > Get rid of all that blah blah Antiquated SAS Macro Language blah and > get your blah blah tail blah blah in gear and blah blah blah SAS > Component Language. These kinds of problems NEVER occur with SAS > Component Language and only complete blah blah blahs still continue to > not only blah but they also continue to recommend it to blah blah > blah newbys. Conditional execution of ANY SAS Statements. including > MERGE, SET, UPDATE and MODIFY are never a problem when using SAS > Component Language because blah blah blah. So abandon the Antiquated > Macro Language while you still have a job and blah blah blah using SAS > Component Language. Do it for your children. > > Blah blah blah, > > Joe > > On 9/1/06, toby989@hotpop.com <toby989@hotpop.com> wrote: > >>Hi Toby >> >> >> >>The c dataset looks like: >> >>_name_ f1 f2 f3 >>q01 1 0 0 >>q02 1 0 0 >>q07 1 0 0 >>q03 0 1 0 >>q04 0 1 0 >>q06 0 1 0 >>q05 0 0 1 >> >>and the q's are variables in the ps2004ms dataset. >> >>And my macro that now works only partially looks like: >> >> >> >>%macro efamac(n=,m=,p=,r=,i=); >>%do ix=1 %to &n; >>proc sql; >>select trim(left(_name_)) into :lista separated by ' ' from c where f&ix=1; >>quit; >>proc corr data=psdata.ps2004ms(where=(id<200 and id not in (49, 109) and >>half=0)) alpha nocorr nosimple outp=outcal(where=(_type_='STDALPHA')); >>var &lista ; >>run; >>proc transpose data=outcal(drop=_type_ _name_) out=outcal(drop=_name_); run; >>proc sql; >>insert into outc set _type_='STAT', _name_='STDALPHA', &m&n&p&r=(select distinct >>col1 from outcal); >>quit; >>%end; >>data y; >>%sysfunc(ifc(&i=1, set outc, merge y outc)); >>attrib _all_ label=''; >>run; >>%mend; >> >>data _null_; >>i=1; >>do n=' 3'; >>do m='a'; >>do p='a'; >>do r='n', 'q', 'v'; >>call execute('%efamac(n='||n||',m='||m||',p='||p||',r=' ||r||',i='||i||')'); >>i=i+1; >>end; >>end; >>end; >>end; >>run; >> >> >>Some of the log file: The issue is where my macro variable suddenly becomes >>listed twice, and three times, and 4 times if I my 'to' value of the loop would >>be 4 and so on. >> >> >> >> >>trim(left(_name_)) into :lista separated by ' ' from c where f3=1; >>17 + >> quit; >>NOTE: PROCEDURE SQL used (Total process time): >> real time 0.00 seconds >> cpu time 0.00 seconds >> >> >>17 + >>proc corr data=psdata.ps2004ms(where=(id<200 and id not in (49, 109) and half=0)) >>18 + alpha nocorr nosimple outp=outcal(where=(_type_='STDALPHA')); var &lista >>&lista &lista ; >>run; proc transpose data=outcal(drop=_type_ _name_) out=outcal(drop=_name_); >>run; proc sql; insert >>into outc set _type_='STAT', _name_='STDALPHA', a3an=(select >> >>WARNING: Variable q10 already exists on file WORK.OUTCAL. >>WARNING: Variable q18 already exists on file WORK.OUTCAL. >>WARNING: Variable q20 already exists on file WORK.OUTCAL. >>WARNING: Variable q23 already exists on file WORK.OUTCAL. >>WARNING: Variable q26 already exists on file WORK.OUTCAL. >>WARNING: Variable q31 already exists on file WORK.OUTCAL. >>WARNING: Variable q10 already exists on file WORK.OUTCAL. >>WARNING: Variable q18 already exists on file WORK.OUTCAL. >>WARNING: Variable q20 already exists on file WORK.OUTCAL. >>WARNING: Variable q23 already exists on file WORK.OUTCAL. >>WARNING: Variable q26 already exists on file WORK.OUTCAL. >>WARNING: Variable q31 already exists on file WORK.OUTCAL. >>WARNING: Cronbach's Alpha has been computed with missing values present. Using >>the NOMISS option is >> recommended. >>NOTE: The data set WORK.OUTCAL has 1 observations and 8 variables. >>NOTE: PROCEDURE CORR used (Total process time): >> real time 0.15 seconds >> cpu time 0.15 seconds >> >> >> >>NOTE: There were 1 observations read from the data set WORK.OUTCAL. >>NOTE: The data set WORK.OUTCAL has 6 observations and 1 variables. >>NOTE: PROCEDURE TRANSPOSE used (Total process time): >> real time 0.03 seconds >> cpu time 0.03 seconds >> >> >>19 + distinct col1 from outcal); >>NOTE: 1 row was inserted into WORK.OUTC. >> >>19 + quit; >>NOTE: PROCEDURE SQL used (Total process time): >> real time 0.01 seconds >> cpu time 0.01 seconds >> >> >>19 + data y; set outc; attrib _all_ label=''; >>run; >> >>NOTE: There were 37 observations read from the data set WORK.OUTC. >>NOTE: The data set WORK.Y has 37 observations and 3 variables. >>NOTE: DATA statement used (Total process time): >> real time 0.01 seconds >> cpu time 0.01 seconds >> >> >> >>Toby >> >> >> >> >> >> >> >> >>toby dunn wrote: >> >>>Toby , >>> >>>I would look at your macro code. I tested the code out in two different >>>macro set ups and it always seems to work just fine for me. >>> >>> >>> >>>Toby Dunn >>> >>>When everything is coming at you all at once, your in the wrong lane. >>> >>>A truly happy person is someone who can smile and enjoy the scenery on a >>>detour. >>> >>> >>> >>> >>> >>>From: toby989@HOTPOP.COM >>>Reply-To: toby989@HOTPOP.COM >>>To: SAS-L@LISTSERV.UGA.EDU >>>Subject: Re: exist function question >>>Date: Thu, 31 Aug 2006 19:47:57 -0700 >>> >>>Toby >>> >>>The error, I know, just for testing purposes, to see what the >>>sysfunc(exist(y)) >>>returns. >>> >>>Your example works on my side too. >>> >>>.... >>> >>>Can it be, since my thing is part of a macro, that when I compile the macro >>>the >>>sysfuncs are evaluated and the datastep is created/set in stone. The >>>datastep is >>>not dynamically recreated everytime I call the macro......tested it, seems >>>not >>>to be the case. >>> >>>Toby >>> >>> >>> >>>toby dunn wrote: >>> >>> >>>>Toby , >>>> >>>>data y ; >>>>%sysfunc(exist(y)) ; >>>>run ; >>>> >>>> >>>>Is always gonna give you an error, why well consider what the resulting >>>>data >>>>step code will look like: >>>> >>>>If Data Set Y exists: >>>> >>>>Data Y ; >>>>1 >>>>Run ; >>>> >>>>And If it doesnt exists: >>>> >>>>Data Y ; >>>>0 >>>>Run ; >>>> >>>>Either way you just have a number sitting out there all alone in the night >>>>with no context to help SAS figure out what you are doing. >>>> >>>> >>>> >>>>data y; >>>>%sysfunc(ifc(%sysfunc(exist(y)),merge y outcfa,set outcfa)); >>>>run; >>>> >>>>Works just as Howard advertised it too work just read your log: >>>> >>>>NOTE: There were 34 observations read from the data set WORK.Y. >>>>NOTE: There were 34 observations read from the data set WORK.OUTCFA. >>>>NOTE: The data set WORK.Y has 34 observations and 3 variables. >>>>NOTE: DATA statement used (Total process time): >>>> real time 0.01 seconds >>>> cpu time 0.01 seconds >>>> >>>>Notice that it found data set Y and reads observation from both and merges >>>>them however you have no by statement. Which may or may not cause you >>>>problems. >>>> >>>> >>>>Data Y ; >>>>X = 'A' ; >>>>Y = '1' ; >>>>Output ; >>>> >>>>X = 'B' ; >>>>Y = '2' ; >>>>Output ; >>>> >>>>X = 'C' ; >>>>Y = '3' ; >>>>Output ; >>>> >>>>Run ; >>>> >>>> >>>>Data X ; >>>>X = 'A' ; >>>>Z = '999' ; >>>>Output ; >>>> >>>>X = 'C' ; >>>>Z = '999' ; >>>>Output ; >>>> >>>>Run ; >>>> >>>> >>>>Data Y ; >>>>%SysFunc( IfC( %SysFunc( Exist( Y ) ) , Merge Y X %Str( ; ) By X %Str( ; ) >>>>, >>>>Set X %Str( ; ) ) ) ; >>>>Run ; >>>> >>>>Proc Print >>>>Data = Y ; >>>>Run ; >>>> >>>> >>>> >>>>Toby Dunn >>>> >>>>When everything is coming at you all at once, your in the wrong lane. >>>> >>>>A truly happy person is someone who can smile and enjoy the scenery on a >>>>detour. >>>> >>>> >>>> >>>> >>>> >>>>From: toby989@HOTPOP.COM >>>>Reply-To: toby989@HOTPOP.COM >>>>To: SAS-L@LISTSERV.UGA.EDU >>>>Subject: Re: exist function question >>>>Date: Thu, 31 Aug 2006 16:11:13 -0700 >>>> >>>>Howard Schreier <hs AT dc-sug DOT org> wrote: >>>> >>>> >>>> >>>>>On Wed, 30 Aug 2006 14:40:13 -0700, toby989@HOTPOP.COM wrote: >>>>> >>>>> >>>>> >>>>> >>>>> >>>>>>do I miss somehting here? >>>>> >>>>> >>>>>Yes, if you were expecting a different outcome. >>>>> >>>>>Remember that the DATA step examines the headers of all input data sets >>>>>(those named on SET, MERGE, UPDATE, and MODIFY statements) at compile >>>>>time. >>>>> >>>>>Try this: >>>>> >>>>> data y; >>>>> %sysfunc(ifc(%sysfunc(exist(y)),merge y outcfa,set outcfa)); >>>>> run; >>>>> >>>> >>>>Thank you. This is very helpful. the %sysfunc(exist(y)) returns '1' as can >>>>be >>>>seen below. But the %sysfunc(ifc(...)) does not take it somehow. >>>> >>>>76 data y; >>>>77 %sysfunc(exist(y)); >>>>NOTE: Line generated by the macro function "SYSFUNC". >>>>1 1 >>>> - >>>> 180 >>>>ERROR 180-322: Statement is not valid or it is used out of proper order. >>>> >>>>78 run; >>>> >>>>NOTE: The SAS System stopped processing this step because of errors. >>>>WARNING: The data set WORK.Y may be incomplete. When this step was stopped >>>>there were 0 >>>> observations and 0 variables. >>>>WARNING: Data set WORK.Y was not replaced because this step was stopped. >>>>NOTE: DATA statement used (Total process time): >>>> real time 0.01 seconds >>>> cpu time 0.01 seconds >>>> >>>> >>>> >>>> >>>>It only performs the 'set' command. >>>> >>>>79 data y; >>>>80 %sysfunc(ifc(%sysfunc(exist(y)),merge y outcfa,set outcfa)); >>>>81 run; >>>> >>>>NOTE: There were 34 observations read from the data set WORK.Y. >>>>NOTE: There were 34 observations read from the data set WORK.OUTCFA. >>>>NOTE: The data set WORK.Y has 34 observations and 3 variables. >>>>NOTE: DATA statement used (Total process time): >>>> real time 0.01 seconds >>>> cpu time 0.01 seconds >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>>>>data y; if (exist('y')) then merge y outcfa; else set outcfa; run; >>>>>>ERROR: File WORK.Y.DATA does not exist. >>>>>> >>>>>>NOTE: The SAS System stopped processing this step because of errors. >>>>>>WARNING: The data set WORK.Y may be incomplete. When this step was >>>>>>stopped >>>>>>there were 0 >>>>>> observations and 3 variables. >>>>>>NOTE: DATA statement used (Total process time): >>>>>> real time 0.01 seconds >>>>>> cpu time 0.01 seconds >> > > > -- > To paraphrase G. Santayana, the SAS Macro Facility used by common SAS > programmers is an old mate that gives no pleasure and many headaches, > yet she/he cannot live without it, and resents any aspersions that > strangers may cast on its character |
|
|
![]() |
| Thread Tools | |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Re: A scan function question | Nat Wooding | Newsgroup comp.soft-sys.sas | 0 | 01-23-2009 12:13 PM |
| Re: A scan function question | Akshaya Nathilvar | Newsgroup comp.soft-sys.sas | 0 | 01-22-2009 08:32 PM |
| Re: A Function question | Douglas Martin | Newsgroup comp.soft-sys.sas | 0 | 06-06-2007 09:30 PM |
| Re: A Function question | toby dunn | Newsgroup comp.soft-sys.sas | 0 | 06-06-2007 08:07 PM |
| Re: sorry,a stupid question about function | David L Cassell | Newsgroup comp.soft-sys.sas | 0 | 11-29-2005 05:35 AM |