🔒 This topic is solved and locked.
Need further help from the community? Please
sign in and ask a new question.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Posted 12-13-2020 12:42 AM
(2002 views)
Hi , I have a dataset as shown below. I need to only pick the values like 2081 2082 2084 and 2084 into a 4 macro variable and ignore if 0000. Can you please suggest
Column1 | column2 | column3 | Column4
0000 | 0000 | 0000 | 2084
2081 | 0000 | 0000 | 0000
0000 | 2082 | 2083 | 0000
Column1 | column2 | column3 | Column4
0000 | 0000 | 0000 | 2084
2081 | 0000 | 0000 | 0000
0000 | 2082 | 2083 | 0000
1 ACCEPTED SOLUTION
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
data have;
infile cards dlm='|';
input Column1- Column4;
cards;
0000 | 0000 | 0000 | 2084
2081 | 0000 | 0000 | 0000
0000 | 2082 | 2083 | 0000
;
proc sql;
select max(Column1),max(Column2),max(Column3),max(Column4)
into : c1,: c2,: c3,: c4
from have;
quit;
%put _user_ ;
10 REPLIES 10
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
There's always 4 variables, 3 rows, and 4 values?
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Rows can be between 1 to 4 it depends
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
What will you be doing with those macro variables later on?
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
The given dataset createf in a macro ,Based on the macro parameters.these dataset rows would be between 1 to 4 depend on the data. Now once I get the unique values I will pass the values into below code using a macro variable
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
And what will that below code do?
I ask because in 90% (if not 100%) of cases it is not necessary to create a list of macro variables, but instead the code can be created (or called) directly from the dataset.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Yes, I understand but existing code already use the macro variable . So I doesn't want to change the approach . Is there a way we do in macro variable?
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
data _null_;
set have;
retain counter 0;
array col {*} column:;
do i = 1 to dim(col);
if col{i} ne '0000'
then do;
counter +1;
call symputx(cats('mvar',counter),col{i});
end;
end;
run;
Mind that perpetuating a bad code structure by adding even more bad code to it is always a bad idea. Improving suboptimal code is a worthy investment into your own future.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Thanks
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
data have;
infile cards dlm='|';
input Column1- Column4;
cards;
0000 | 0000 | 0000 | 2084
2081 | 0000 | 0000 | 0000
0000 | 2082 | 2083 | 0000
;
proc sql;
select max(Column1),max(Column2),max(Column3),max(Column4)
into : c1,: c2,: c3,: c4
from have;
quit;
%put _user_ ;
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Thanks it's very awesome