DATA Step, Macro, Functions and more

SAS Base Query

Accepted Solution Solved
Reply
Contributor scb
Contributor
Posts: 69
Accepted Solution

SAS Base Query

The below codes is working fine.  Just want to know if there is any way to have to same result without RENAME and DROP variables? Thanks.

 

DATA A;
INFILE CARDS;
INPUT ID ;
CARDS;
3453
123162
124171
1241761
;
RUN;

DATA A(RENAME=(ID1=ID));
SET A;
ID1 = PUT(ID,z7.);
DROP ID;
RUN;


Accepted Solutions
Solution
‎03-03-2017 02:02 AM
Trusted Advisor
Posts: 1,558

Re: SAS Base Query

[ Edited ]

In your output ID1 is numeric while ID is char type.

Your code is the easyiest way to bo done;

View solution in original post


All Replies
Solution
‎03-03-2017 02:02 AM
Trusted Advisor
Posts: 1,558

Re: SAS Base Query

[ Edited ]

In your output ID1 is numeric while ID is char type.

Your code is the easyiest way to bo done;

Respected Advisor
Posts: 4,920

Re: SAS Base Query

[ Edited ]

Do it in a single step:

 

DATA A;
INFILE CARDS;
INPUT ID :$7. ;
id = translate(right(id),"0"," ");
CARDS;
3453
123162
124171
1241761
; 

 

PG
Trusted Advisor
Posts: 1,558

Re: SAS Base Query

@PGStats, you probably know that input a CHAR type is left aligned.

Then 

DATA A;
INFILE CARDS;
INPUT ID :$7. ;
id = translate(right(id),"0"," ");
CARDS;
3453
; run;

will create ID='3453000' while the equivalent to the number 3453 is '0003453';

 

In this case, it can be done by:

DATA A;
INFILE CARDS;
INPUT ID :$7. ;
id = put(input(id,best7.),z7.);
CARDS;
3453
; run;

 

Respected Advisor
Posts: 4,920

Re: SAS Base Query

Hi @Shmuel, you are right in saying that input reads left aligned, which is why I use the right function to make it right aligned before replacing the spaces with leading zeros.

PG
Trusted Advisor
Posts: 1,558

Re: SAS Base Query

Hi @PGStats, you are right, I skiped the right in your code.

 

Any way, our debate is a good lesson to SAS starting users.

Super User
Super User
Posts: 7,942

Re: SAS Base Query

Sorry @Shmuel that may not be 100% correct.  It depends on what the OP user is expecting from the variable.  If they really do want a text field then I have no problem with it.  If however they just want that data as z7. then the simplest method is to apply the format to the already existing numeric data:

data a;
  infile cards;
  input id;
  format id z7.;   /* <-- this is the only thing needed to display as z7. */
cards;
3453
123162
124171
1241761
;
run;

OP: Please do not code all in upper case, it really makes code so much harder to look at.

Trusted Advisor
Posts: 1,558

Re: SAS Base Query

@RW9, you are right if the target was just displaying the number with leading zeroes.

 

The original query included code:

DATA A(RENAME=(ID1=ID));
SET A;
ID1 = PUT(ID,z7.);
DROP ID;
RUN;

Which I understand that the target is changing type of variable in a dataset.

☑ This topic is solved.

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

Discussion stats
  • 7 replies
  • 206 views
  • 0 likes
  • 4 in conversation