BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
annaleticia
Fluorite | Level 6

Data Set

ID      Date            Variable

111    12/7/2021     A

111    12/7/2021     B

111    12/7/2021     C

222    12/6/2021    A

222     12/7/2021   A

 

Expected Result

ID   Date          Variable

111 12/7/2021  A, B, C

222  12/6/2021 A

222  12/7/2021 A

1 ACCEPTED SOLUTION

Accepted Solutions
Reeza
Super User

Typically two ways - one is a data step and combine as you go down the rows and output on the last group record. This utilizes RETAIN and BY group processing. 
The second method is to transpose the data into a wide format using PROC TRANSPOSE and then use CATX() to combine the data.

Both are illustrated below.

 

*create sample data for demonstration;
data have;
    infile cards dlm='09'x;
    input OrgID Product $   States $;
    cards;
1   football    DC
1   football    VA
1   football    MD
2   football    CA
3   football    NV
3   football    CA
;
run;

*Sort - required for both options;
proc sort data=have;
    by orgID;
run;

**********************************************************************;
*Use RETAIN and BY group processing to combine the information;
**********************************************************************;
data want_option1;
    set have;
    by orgID;
    length combined $100.;
    retain combined;

    if first.orgID then
        combined=states;
    else
        combined=catx(', ', combined, states);

    if last.orgID then
        output;
run;

**********************************************************************;
*Transpose it to a wide format and then combine into a single field;
**********************************************************************;
proc transpose data=have out=wide prefix=state_;
    by orgID;
    var states;
run;

data want_option2;
    set wide;
    length combined $100.;
    combined=catx(', ', of state_:);
run;

https://gist.github.com/statgeek/d583cfa992bf56da51d435165b07e96a

 


@annaleticia wrote:

Data Set

ID      Date            Variable

111    12/7/2021     A

111    12/7/2021     B

111    12/7/2021     C

222    12/6/2021    A

222     12/7/2021   A

 

Expected Result

ID   Date          Variable

111 12/7/2021  A, B, C

222  12/6/2021 A

222  12/7/2021 A


 

View solution in original post

3 REPLIES 3
Reeza
Super User

Typically two ways - one is a data step and combine as you go down the rows and output on the last group record. This utilizes RETAIN and BY group processing. 
The second method is to transpose the data into a wide format using PROC TRANSPOSE and then use CATX() to combine the data.

Both are illustrated below.

 

*create sample data for demonstration;
data have;
    infile cards dlm='09'x;
    input OrgID Product $   States $;
    cards;
1   football    DC
1   football    VA
1   football    MD
2   football    CA
3   football    NV
3   football    CA
;
run;

*Sort - required for both options;
proc sort data=have;
    by orgID;
run;

**********************************************************************;
*Use RETAIN and BY group processing to combine the information;
**********************************************************************;
data want_option1;
    set have;
    by orgID;
    length combined $100.;
    retain combined;

    if first.orgID then
        combined=states;
    else
        combined=catx(', ', combined, states);

    if last.orgID then
        output;
run;

**********************************************************************;
*Transpose it to a wide format and then combine into a single field;
**********************************************************************;
proc transpose data=have out=wide prefix=state_;
    by orgID;
    var states;
run;

data want_option2;
    set wide;
    length combined $100.;
    combined=catx(', ', of state_:);
run;

https://gist.github.com/statgeek/d583cfa992bf56da51d435165b07e96a

 


@annaleticia wrote:

Data Set

ID      Date            Variable

111    12/7/2021     A

111    12/7/2021     B

111    12/7/2021     C

222    12/6/2021    A

222     12/7/2021   A

 

Expected Result

ID   Date          Variable

111 12/7/2021  A, B, C

222  12/6/2021 A

222  12/7/2021 A


 

ballardw
Super User

What do you expect to do with that data set that you can't do with the original?

 

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

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
  • 3 replies
  • 28107 views
  • 1 like
  • 3 in conversation