DATA Step, Macro, Functions and more

Modify Table

Accepted Solution Solved
Reply
Occasional Contributor
Posts: 9
Accepted Solution

Modify Table

Hello everyone,

 

This is an example of my problem I have this dataset:

 

john 1 2 3

alex 2 5 6

tito 1 2 6

 

And I want this:

 

john 1

john 2

john 3

alex 2

alex 5

alex 6

tito 1

tito 2

tito 6

 

If you have any idea ( of course I have 100 hundred columns this is just an example).

 

Thanks a lot.

 

 


Accepted Solutions
Solution
‎04-04-2016 02:46 PM
Trusted Advisor
Posts: 1,118

Re: Modify Table

Posted in reply to alexandralorenzo

Hello Alexandra,

 

Try this:

data have;
input name $ x y z;
cards;
john 1 2 3
alex 2 5 6
tito 1 2 6
;

data want;
set have;
array oldvar x--z;
do _i=1 to dim(oldvar);
value=oldvar[_i];
output;
end;
keep name value;
run;

If your variables x, y, z (etc.) are character variables, please define the length of new variable VALUE appropriately using a LENGTH statement. If some are numeric and others are character and you want to have all values in a single character variable VALUE, you have to create two arrays (one for the numeric, one for the character variables) and convert the numeric values to character values by means of the PUT function in the assignment statement (value=...) of one of (then) two DO loops.

 

View solution in original post


All Replies
Super User
Posts: 19,851

Re: Modify Table

Posted in reply to alexandralorenzo
Try Proc Transpose or a data step using arrays.

If you need examples google 'ucla wide to long' or search on here.
Super User
Super User
Posts: 7,977

Re: Modify Table

Posted in reply to alexandralorenzo
data have;
  a="john"; v1=1; v2=2; v3=3;
run;
proc transpose data=have out=want;
  by a;
  var v:;
run;
Solution
‎04-04-2016 02:46 PM
Trusted Advisor
Posts: 1,118

Re: Modify Table

Posted in reply to alexandralorenzo

Hello Alexandra,

 

Try this:

data have;
input name $ x y z;
cards;
john 1 2 3
alex 2 5 6
tito 1 2 6
;

data want;
set have;
array oldvar x--z;
do _i=1 to dim(oldvar);
value=oldvar[_i];
output;
end;
keep name value;
run;

If your variables x, y, z (etc.) are character variables, please define the length of new variable VALUE appropriately using a LENGTH statement. If some are numeric and others are character and you want to have all values in a single character variable VALUE, you have to create two arrays (one for the numeric, one for the character variables) and convert the numeric values to character values by means of the PUT function in the assignment statement (value=...) of one of (then) two DO loops.

 

Occasional Contributor
Posts: 9

Re: Modify Table

Posted in reply to alexandralorenzo
Thanks a lot
Occasional Contributor
Posts: 9

Re: Modify Table

Posted in reply to alexandralorenzo
The problem with proc transpose that you need a proc sort and take a long time :/
☑ This topic is solved.

Need further help from the community? Please ask a new question.

Discussion stats
  • 5 replies
  • 296 views
  • 1 like
  • 4 in conversation