BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
UniversitySas
Quartz | Level 8

Suppose I have some data with three variables:

ID, Date, Var1.

 

I want to create a 'counter' variable for Var1, such that for each ID, every time Var1 is non-empty/non-missing, my var1_counter increases by 1. 

The output would look like this:

 

data temp;
infile DATALINES dsd missover;
input ID DATE(month_num) Var1 Var1_Counter;
CARDS;
01, 1, ., .
01, 2, 3.5, 1
01, 3, ., 1
01, 4, 1.4, 2
01, 5, ., 2
02, 1, ., .
02, 2, 1.2, 1
02, 3, 1.4, 2
02, 4, 1.7, 3
02, 5, 5.1, 4
;
run;

Additionally, if I could just get the final count for each ID, (in my example final count for ID = 01 would be 2, for 02 it would be 4.

 

Thanks for the help!

 

1 ACCEPTED SOLUTION

Accepted Solutions
ChrisNZ
Tourmaline | Level 20

Like this?

data WANT;
  set HAVE;
  by ID;
  if first.ID then COUNTER=0;
  COUNTER+(VAR1 ne .);
run;

 

View solution in original post

6 REPLIES 6
Reeza
Super User

I would suggest using PROC MEANS if the variable is numeric. If its character you'll need a different approach via PROC FREQ.

 

proc means data=have N NMISS;
class id;
var var1;
ods output summary=want;
run;

The output will be displayed and in the data set called WANT.

 


@UniversitySas wrote:

Suppose I have some data with three variables:

ID, Date, Var1.

 

I want to create a 'counter' variable for Var1, such that for each ID, every time Var1 is non-empty/non-missing, my var1_counter increases by 1. 

The output would look like this:

 

data temp;
infile DATALINES dsd missover;
input ID DATE(month_num) Var1 Var1_Counter;
CARDS;
01, 1, ., .
01, 2, 3.5, 1
01, 3, ., 1
01, 4, 1.4, 2
01, 5, ., 2
02, 1, ., .
02, 2, 1.2, 1
02, 3, 1.4, 2
02, 4, 1.7, 3
02, 5, 5.1, 4
;
run;

Additionally, if I could just get the final count for each ID, (in my example final count for ID = 01 would be 2, for 02 it would be 4.

 

Thanks for the help!

 


 

ChrisNZ
Tourmaline | Level 20

Like this?

data WANT;
  set HAVE;
  by ID;
  if first.ID then COUNTER=0;
  COUNTER+(VAR1 ne .);
run;

 

UniversitySas
Quartz | Level 8

Thanks, this is exactly what I was looking for. I had the logic down, but I was trying to condition "if first.ID" as "if first.var1". 

ed_sas_member
Meteorite | Level 14

Hi @UniversitySas 

 

A complementary approach to the one proposed by @Reeza  and @ChrisNZ , using PROC SQL:

proc sql;
	/* create table want as */
	select count(Var1) as Not_Missing,
		   nmiss(Var1) as Missing
	from temp
	group by ID;
run;

 

If you want to output the results of PROC MEANS:

proc means data=temp n nmiss;
	var Var1;
	class id;
	output out=want n= nmiss= / autoname;
run;

 

Best,

nicobuettner
SAS Employee
data temp2(drop=Counter);
  set temp;

  attrib Counter length=8;

  by ID;

  if first.ID then Counter = 0;

  if Var1 ne . then Counter+1; * retains Counter and adds 1;

  if Counter = 0 then Var1_Counter = .;
  else Var1_Counter = Counter;

  if last.ID then output; * use this if you only need totals;
run;
Tom
Super User Tom
Super User

Do you really want the counter to start with MISSING instead of ZERO?

data want;
  set temp;
  by id;
  if first.id then want=0;
  want + not missing(var1);
run;
             month_             Var1_
Obs    ID      num     Var1    Counter    want

  1     1       1        .        .         0
  2     1       2       3.5       1         1
  3     1       3        .        1         1
  4     1       4       1.4       2         2
  5     1       5        .        2         2
  6     2       1        .        .         0
  7     2       2       1.2       1         1
  8     2       3       1.4       2         2
  9     2       4       1.7       3         3
 10     2       5       5.1       4         4

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

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
  • 6 replies
  • 2875 views
  • 0 likes
  • 6 in conversation