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 save with the early bird rate—just $795!
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.