BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
Moksha
Pyrite | Level 9

Hi All,

       I have to process different datasets and add a column to it. But, this new column gets added to the beginning of the datasets. I want to move this to the end of all columns in each dataset. I know that  length, attrib, retain, format, informat can be used to reorder the columns as required, but they require to mention the columns names, but the problem here is that I don't know what other columns are there in each dataset since each dataset has different columns and each of them have 25+ columns.

 

Please,  advise how to reorder in this case and provide some sample code, if possible.

1 ACCEPTED SOLUTION

Accepted Solutions
Moksha
Pyrite | Level 9

Thank you very much. The code provided by you:  has worked.

data test;
  set test(drop=ch1 ch2);
  length ch1 ch2 $12;
  set test(keep=ch1 ch2);
run;

 

 

 

View solution in original post

14 REPLIES 14
AhmedAl_Attar
Ammonite | Level 13

@Moksha 

Try this

data <DsName);
   if (0) the Set <originalDsName>; /* would declare all the vars in the PDV */
   Length ...;
   set <originalDsName>;
run;

Hope this helps

Moksha
Pyrite | Level 9

I didn't understand 

what exactly we need give in length as I should not alter the lengths of the variables and I don't know the variable names also.

 

Can you please explain what is length ...;

 

Thanks

AhmedAl_Attar
Ammonite | Level 13

@Moksha 

 

The Length statement is for the new variables!

if (0) then SET <originalDataSet>; /* Will place all pre-existing variables in the PDV */

Any other variables created after that statement, will appear at the end of the output data set. For illustration, run the code below.

data class;
	set sashelp.class(keep=name age sex obs=5);
run;
proc contents data=class varnum; run;

data class;
 if (0) then set class;
 Length newV1 newV2 newV3 3;
 retain newV1 newV2 newV3 0;
 set class;
run;
proc contents data=class varnum; run;
Moksha
Pyrite | Level 9

Thank you and I have run this sample code and it is working. Since, I have two new char variables ch1 and ch2 and the data set test has 25 columns. Now, I have tried the following:

 

data test;

         if (0) then set test;

              length ch1 ch2 $12.;

              retain ch1 ch2 $12.;

          set test;

run;

It's not working.  Getting error:

ERROR 200-322: The symbol is not recognized and will be ignored.

 

Can you please advise how to work with new char variables?

Tom
Super User Tom
Super User

The error message you posted would not be generated by that code (unless there are some invisible characters there, perhaps TAB or non-breaking spaces).

 

But if you just want to add two new variables then just add the two new variables. There is no need to do anything strange.

data test;
  set test;
  length ch1 ch2 $12;
run;

If the request is to MOVE existing variables to the end then use DROP= and KEEP= dataset options.

data test;
  set test(drop=ch1 ch2) test(keep=ch1 ch2);
run;

If you want to MOVE them and also change the lengths use two SET statements so you can add the LENGTH statement in between.

data test;
  set test(drop=ch1 ch2);
  length ch1 ch2 $12;
  set test(keep=ch1 ch2);
run;

PS Lengths can only be integers so there is no need to include a decimal point.

Moksha
Pyrite | Level 9

Thank you very much. The code provided by you:  has worked.

data test;
  set test(drop=ch1 ch2);
  length ch1 ch2 $12;
  set test(keep=ch1 ch2);
run;

 

 

 

Tom
Super User Tom
Super User

If you are one of those people that needlessly attach $ formats to character variables (or you had them attached for you by SAS generated code) then you might also want to remove any format attach to those moved variables by adding  this statement to the end of your data step. 

format ch1 ch2 ;

The problem with attaching the $ format to a character variable is when the width of the format is different from the length of the variable it can cause problems.   If the width is less than the length then when you print the values they look truncated.  It the width is larger then you might accidentally try to assign too long a value to the variable and then it will actually be truncated.

AhmedAl_Attar
Ammonite | Level 13
You have syntax error.
You cannot retain a length!
Moksha
Pyrite | Level 9

I have tried multiple ways like retain without mentioning $12. or $12 and also length statement without . but since getting errors. I have posted only one code. 

PaigeMiller
Diamond | Level 26

My opinion is that there is rarely, if ever, a compelling reason to move columns to the right or move them to the left. Most PROCs and DATA steps really don't care where in the data set the column exists. 

 

However, when you output the data set somehow for humans to look at, then the column order matters, but using PROC PRINT, PROC TABULATE, PROC REPORT you have complete control over the ordering of columns in a much more intuitive way, and this is much easier to program as well. For example, here's a way to print the SASHELP.CLASS data set with columns in different order:

 

proc print data=sashelp.class;
    var age sex height weight name;
run;

 

Note that I did not have to move NAME to the end of the data set using DATA step commands, and yet it will print as the last column.

 

So @Moksha , please re-consider the need to move columns around within a data set, and please consider using other tools to make columns appear in different places as shown above, this will make your programming much easier. It is a very rare situation where you really need to have columns in a specific order within a data set.

--
Paige Miller
Moksha
Pyrite | Level 9

I know that with proc print  using var will reorder as mentioned. But, I have requirement to have the newly added columns are at end.  Is it a limitation of SAS that there is no other alternative ways to reorder the columns in case we don't the column names and we have many number of columns which is not possible to list all columns. But, we have to list the columns names in all the ways that are available right now with SAS, but it's not possible to list all column names as we don't know the column names and the number of columns is huge.  

PaigeMiller
Diamond | Level 26

I have requirement to have the newly added columns are at end

 

Well, if someone has told you that specific columns HAVE TO BE on the right, I think this person has a misunderstanding which causes you to do unnecessary work. You might consider (politely) pushing back on this requirement.

--
Paige Miller
Tom
Super User Tom
Super User

I don't understand.  That should be the NORMAL behavior.

data want;
  set sashelp.class ;
  newvar = age ** 2;
run;
Reeza
Super User

Do you know the name of the new column ahead of time or need to determine it dynamically?

As Tom mentioned, this should be the default behaviour so sharing how you are creating this variable might be helpful. Could be that a small change in code could accomplish what you need without further modifications.

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 14 replies
  • 2402 views
  • 4 likes
  • 5 in conversation