I have the following table. What I would like to do is report the sum of all 1's overall by subjectID. Only 1's, no 2's, 0's, missing
have
| SubjectID | value1 | value2 | value3 |
| 1 | 1 | 0 | |
| 1 | 0 | 1 | 2 |
| 1 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 |
| 2 | 0 | 1 | 0 |
| 2 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 |
| 2 | 0 | 0 | 1 |
| 2 | 0 | 0 | 2 |
| 2 | 0 | 0 | 2 |
| 3 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 |
| 4 | 1 | 0 | 1 |
| 4 | 1 | 1 | 0 |
| SubjectID | total |
| 1 | 2 |
| 2 | 2 |
| 3 | 0 |
| 4 | 4 |
i tried the following
proc sql;
select subjectid, count(subjectid) as total
from a.have
where value1 = 1 or value2 = 1 or value3= 1;quit;
Below will run according to what you requested; keep in mind if your expected output changes this likely won't cross over well.
Edit: Made correction to code.
proc sql;
create table want as
select SubjectID, SUM(Value1=1)+SUM(Value2=1)+SUM(Value3=1) As Total
from have
group by SubjectID;
quit;
Hi @monday89 I'm afraid SQL is not best suited for wide datasets.
data have;
input SubjectID value1 value2 value3;
cards;
1 1 0 .
1 0 1 2
1 0 0 0
1 0 0 0
2 0 1 0
2 0 0 0
2 0 0 0
2 0 0 1
2 0 0 2
2 0 0 2
3 0 0 0
4 0 0 0
4 1 0 1
4 1 1 0
;
data want;
do until(last.subjectid);
set have;
by subjectid;
array t value1-value3;
call missing(n);
do over t;
if t=1 then n=sum(t,n);
end;
sum=sum(sum,n,0);
end;
keep subjectid sum;
run;
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!
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.
Ready to level-up your skills? Choose your own adventure.