BookmarkSubscribeRSS Feed
Babloo
Rhodochrosite | Level 12

I tried the code as follows and ended up with error. If there is any observation in the dataset then I want to get that value in 'vars' dataset and if no Observation I want to get missing value.

 

2859       data vars;
2860       if 0 then set dis_entity_id;
2861       call missing(of _all_);
2862       else set dis_entity_id;
           ____
           160
ERROR 160-185: No matching IF-THEN clause.

2863       output;
2864       stop;
2865       run;

NOTE: The SAS System stopped processing this step because of errors.
7 REPLIES 7
PaigeMiller
Diamond | Level 26

ELSE must be the next command after the IF.

 

Or ... If you use the structure IF ... THEN ... DO ... END, then the ELSE must be the next command after the END

--
Paige Miller
Tom
Super User Tom
Super User

You have a statement between the IF and the ELSE.

Note that you do NOT need the ELSE.  Your IF condition is always going to be false so whatever statement you wanted to put after the ELSE can just be run unconditionally since you want it to always run.

 

data vars;
  if 0 then set dis_entity_id;
  call missing(of _all_);
  set dis_entity_id;

 It looks like you are just trying create a dataset with one observation that has all missing values. (why???)

That can be done then use one of these. The shorter one will get a NOTE in the log about stopping because of looping.

data vars;
  if 0 then set dis_entity_id;
run;

data vars;
  if 0 then set dis_entity_id;
  output;
  stop;
run;

If you want to create a dataset with zero observations use one of these:

data vars;
  set dis_entity_id;
  stop;
run;
data vars;
  set dis_entity_id(obs=0);
run;

 

Meghna14
Fluorite | Level 6

     data vars;
       if 0 then set dis_entity_id; else set dis_entiti_id;
       call missing(of _all_);


       output;
       stop;
       run;

 

this should work fine . if and else statement shall come together .

Babloo
Rhodochrosite | Level 12
May I know for which condition the 'call missing' will execute? I want it
to execute only if obs is 0 in the source dataset.
Tom
Super User Tom
Super User

@Babloo wrote:
May I know for which condition the 'call missing' will execute? I want it
to execute only if obs is 0 in the source dataset.

Doesn't really make any sense. If there are no values then the values are already missing.

 

What output do you want when there are 0 observations in the source?  Do you want 0 observations, 1 observation, something else?

What output do you want when there is only 1 observation in the source?

What output do you want when there are more than 1 observation in the source?

Babloo
Rhodochrosite | Level 12
I want to display missing value for a variable only if source dataset has 0
observation.

If the source dataset has 1 or more than 1 observations then I want those
observation(s) in the output.
Tom
Super User Tom
Super User

@Babloo wrote:
I want to display missing value for a variable only if source dataset has 0
observation.

If the source dataset has 1 or more than 1 observations then I want those
observation(s) in the output.

You are still not describing what you want completely. Examples really help. 

The only reason to do ANYTHING is if you want to output 1 observation when there are NO observations in the source.

You could use the NOBS= option on SET statement to check how many observations, but that will not work for views and other types of datasets where the metadata of the number of observations is not available. It is probably better to use the END= option as that will work for all data sources.

 

So you need to conditionally add an OUTPUT statement to get the extra observation created.  But once you have an OUTPUT statement you need to add one at the end of the step to replace the implicit OUTPUT that is normally added to a data step.  Also you need test BEFORE the SET statement because once the SET statement reads past the end of the input data the step stops. So any statements after the SET will never execute if the input dataset is empty.

 

data want ;
  if _n_=1 and eof then output;
  set have end=eof;
  output;
run;

Note you can simplify (obfuscate?) by changing the IF condition and eliminate the need for the extra OUTPUT statement.

data want;
  if (_n_>1) or eof then output;
  set have end=eof;
run;

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 7 replies
  • 991 views
  • 1 like
  • 4 in conversation