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

Suppose I have a list of new visitors sorted by last name descending. If I have an even number of visitors I want to send the top half to one salesperson and another to the other salesperson.

Have:

ZunigaJames
UtigaTom
BalforJane

Anderson

Jessica


Want:
Salesperson A gets:

ZunigaJames
UtigaTom


Sales person B gets:

BalforJane
AndersonJessica


However, suppose I have and odd number of visitors. Since Salesperson A has a higher priority, I want them to get the extra visitor.

Have:

ZunigaJames
UtigaTom
LemieuxLynn
BalforJane

Anderson

Jessica


Want:
Salesperson A gets:

ZunigaJames
UtigaTom
LemieuxLynn


Salesperson B gets:

BalforJane

Anderson

Jessica





1 ACCEPTED SOLUTION

Accepted Solutions
russt_sas
SAS Employee

Here is one way to accomplish your task:

 

data one;
input last $ first $;
cards;
Zuniga James
Utiga Tom
Lemieux Lynn
Balfor Jane
Anderson Jessica
;

data A B;
set one nobs=obs;
half=obs/2;
if mod(obs,2)=0 then do;
if _n_ le half then output A;
else output B;
end;
else do;
if _n_ le ceil(half) then output A;
else output B;
end;

run;

proc print;
run;

View solution in original post

4 REPLIES 4
russt_sas
SAS Employee

Here is one way to accomplish your task:

 

data one;
input last $ first $;
cards;
Zuniga James
Utiga Tom
Lemieux Lynn
Balfor Jane
Anderson Jessica
;

data A B;
set one nobs=obs;
half=obs/2;
if mod(obs,2)=0 then do;
if _n_ le half then output A;
else output B;
end;
else do;
if _n_ le ceil(half) then output A;
else output B;
end;

run;

proc print;
run;

ballardw
Super User

Similar but less code:

data have;
  input name $;
datalines;
abc
pdq
vvv
jhi
ccc
;
data want;
   set have nobs=num;
   group = (_n_ le round( (num/2),1) );
run;

Assumes that the ORDER of the names in the data is important.

Nobs= creates a temporary variable of the count of observations in the data set.

Round( (num/2,1) ) rounds the division of the number of records divided by 2 to the nearest integer, so the 2.5 you would get from 5 records gets rounded to 3.

_N_ is a counter for the number of iterations of the data step. In a simple action like this it will act as a row counter. so if the _N_ is less than or equal to that half way we will get 1 and 0 other wise as that is how SAS returns the values of logical comparisons: 1 for true, 0 for false.

 

Caution: this sort of algorithm doesn't extend well to a generic N number of groups. Proc Rank or Surveyselect might be better in a more complex selection.

mmaleta851
Fluorite | Level 6

This worked. Thank you.

PaigeMiller
Diamond | Level 26

Don't split the dataset. Assign value of 0 to the top half and 1 to the bottom half (or something like that). Keep everything in one data set.

--
Paige Miller

hackathon24-white-horiz.png

The 2025 SAS Hackathon Kicks Off on June 11!

Watch the live Hackathon Kickoff to get all the essential information about the SAS Hackathon—including how to join, how to participate, and expert tips for success.

YouTube LinkedIn

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
  • 4 replies
  • 1288 views
  • 4 likes
  • 4 in conversation