Hi,
How do i fetch multiple column name for a value using Vname function.
/*Input*/
Vid sep_2017 Oct_2017 Nov_2017 Dec_2017 jan_2018 max
aa 3 0 5 1 0 5
bb 4 4 4 4 2 4
cc 8 3 8 1 2 8
dd 0 0 0 5 1 5
ee 9 2 5 6 9 9
/*expected output**/
Vid sep_2017 Oct_2017 Nov_2017 Dec_2017 jan_2018 max Period
aa 3 0 5 1 0 5 Nov_2017
bb 4 4 4 4 2 4 sep_2017,Oct_2017,Nov_2017,Dec_2017
cc 8 3 8 1 2 8 sep_2017,Nov_2017
dd 0 0 0 5 1 5 Dec_2017
ee 9 2 5 6 9 9 sep_2017,Dec_2017
/**Code**/
Data want;
Length period $200.;
Set need;
Array V (*) sep_2017 -- jan_2018 ;
do i = 1 to dim(v)until (i = DIM(V));
if v{i}=Highest_variance then do;
name=vname(v[whichn(Highest_variance, of v{i} )]);
period=CATX(',',period,name);
end;
end;
RUN;
So where is the value "highest_variance" supposed to come from?
Please describe exactly how you will use that variable with all the comma separated values. Many times when we see this sort of request we get another one a week or two later about pulling that combined value apart for actual use.
Hi,
apologies for the incorrect code.
/*Input*/
Vid sep_2017 Oct_2017 Nov_2017 Dec_2017 jan_2018 max
aa 3 0 5 1 0 5
bb 4 4 4 4 2 4
cc 8 3 8 1 2 8
dd 0 0 0 5 1 5
ee 9 2 5 6 9 9
/*expected output**/
Vid sep_2017 Oct_2017 Nov_2017 Dec_2017 jan_2018 max Period
aa 3 0 5 1 0 5 Nov_2017
bb 4 4 4 4 2 4 sep_2017,Oct_2017,Nov_2017,Dec_2017
cc 8 3 8 1 2 8 sep_2017,Nov_2017
dd 0 0 0 5 1 5 Dec_2017
ee 9 2 5 6 9 9 sep_2017,Dec_2017
/**Code**/
Data want;
Length period $200.;
Set need;
Array V (*) sep_2017 -- jan_2018 ;
do i = 1 to dim(v)until (i = DIM(V));
if v{i}=max then do;
name=vname(v[whichn(max, of v{i} )]);
period=CATX(',',period,name);
end;
end;
RUN;
Your loop is a little convoluted. Why are your using the UNTIL() clause?
Calculate the max value before the loop.
Then you just need to loop over the array and call the VNAME() function when you have hit a copy of the max value.
data want;
set need;
length period $200.;
array V sep_2017 -- jan_2018 ;
max = max(of v[*]);
do i = 1 to dim(v);
if v[i]=max then period=catx(',',period,vname(v[i]));
end;
run;
You can do something like this
data have;
input Vid $ sep_2017 Oct_2017 Nov_2017 Dec_2017 jan_2018 max;
datalines;
aa 3 0 5 1 0 5
bb 4 4 4 4 2 4
cc 8 3 8 1 2 8
dd 0 0 0 5 1 5
ee 9 2 5 6 9 9
;
data temp;
set have;
array v{*} sep_2017 -- jan_2018;
do i=1 to dim(v);
varname=vname(v[i]);
value=v[i];
output;
end;
run;
proc sql;
create table temp2 as
select * from temp
group by Vid
having value=max(value);
quit;
data want;
do until (last.Vid);
set temp2;
Length period $200.;
by Vid;
Period=catx(', ', Period, varname);
end;
drop i varname value;
run;
It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.
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.
Ready to level-up your skills? Choose your own adventure.