Hello,
The table below is what I currently have. Lets call it "Test" for this example
What I want is to transpose the phone_type column and have its values contain the phone numbers from the phone_number column.
Here is the ideal table I want, we'll call it "Final"
I've been trying the following code:
proc transpose data=final out=test;
id phone_type;
var phone_number;
run;
And get this error:
ERROR: The ID value "Home" occurs twice in the input data set.
Any help I can get would be wonderful!
Hello,
I am trying to create a table called "Final" that will look like this (for this example I am using made up data):
Client_ID | Client_Name | Cell | Home | Text Message Opt-in |
1 | Kate | (111)111-1111 | (101)010-1010 | No |
2 | Jack | (202) 020-2020 | ||
3 | Shannon | (333)333-3333 | (303)030-3030 | Yes |
4 | John | (444)444-4444 | (404) 040-4040 | No |
5 | Juliet | (555)555-5555 | Yes | |
6 | Sayid | (666)666-6666 | No | |
7 | Claire | (707) 070-7070 | ||
8 | Alex | (888)888-8888 | (808) 080-8080 | Yes |
9 | Charlie | (999)999-9999 | No |
The table I am working from is called "Test". I've been trying to use Proc Transpose for the columns Phone_Type to create two new columns. The two new columns would be Home and Cell and its values would contain the numbers from the Phone_Number column.
Client_ID | Client_Name | Phone_Type | Phone_Number | Text Message Opt-in |
1 | Kate | Cell | (111)111-1111 | No |
1 | Kate | Home | (101)010-1010 | |
2 | Jack | Home | (202) 020-2020 | |
3 | Shannon | Cell | (333)333-3333 | Yes |
3 | Shannon | Home | (303)030-3030 | |
4 | John | Cell | (444)444-4444 | No |
4 | John | Home | (404) 040-4040 | |
5 | Juliet | Cell | (555)555-5555 | Yes |
6 | Sayid | Cell | (666)666-6666 | No |
7 | Claire | Home | (707) 070-7070 | |
8 | Alex | Cell | (888)888-8888 | Yes |
8 | Alex | Home | (808) 080-8080 | |
9 | Charlie | Cell | (999)999-9999 | No |
Here is the code I've been attempting to use
proc transpose data=final out=test;
id phone_type;
var phone_number;
run;
I keep on getting an error that says the ID value "Home" occurs twice in the input data set.
Any help I can get would be wonderful!
Add
by client_id client_name;
to the TRANSPOSE procedure.
UNTESTED CODE
proc transpose data=test out=final;
by client_id client_name;
var phone_number;
id phone_type;
run;
Since we can't program from screen captures, we request that in the future you provide data as SAS data steps (instructions) and then we can give you tested code. So, @mreynaud , please, no more data as screen captures (and also do not provide data as file attachments, as many people will not download them), data only as SAS data steps.
I don't see the need for proc transpose here, since a self_merge of the dataset (merging cell phone records against corresponding home phone records) should do well:
data want;
merge have (where=(phone_type='Cell') rename=(phone_number=cell))
have (where=(phone_type='Home') rename=(phone_number=home) drop=text_msg_opt);
by clientid client_name;
drop phone_type;
run;
This program is untested in the absence of sample data in the form of a working DATA step.
But it will correctly produce the "test_message_opt_in" column, unlike the PROC TRANSPOSE solutions.
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.