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

Hello,

 

I have approximately 20 subjects and 30 questions (True or False responses). My goal is to tabulate a respondent-by-respondent matrix, in which each cell would have the number of identical responses per individual. Something like this:


sas1.PNG
While right now I have something like this, with respondents as rows and questions as columns:

 

sas2.PNG

 

I was going to try and use if-then statements to calculate the agreeance between each combination of respondent, by transposing the data and doing something like "if var1=var2 then agreeance_12=1; else aggreance_12=0" but this would obviously take a very long time. I would appreciate anyone's help!  

1 ACCEPTED SOLUTION

Accepted Solutions
PGStats
Opal | Level 21

proc distance gets you close ...

 

data have;
input subj $ (res1-res5) (:$1.);
datalines;
1 T F T T F 
2 T F F F T
3 F T F T T 
4 F F F F T
;

proc distance data=have out=want method=match shape=square;
id subj;
var nominal (res1-res5);
run;

proc print data=want noobs; run;
                        subj     _1     _2     _3     _4

                         1      1.0    0.4    0.2    0.2
                         2      0.4    1.0    0.4    0.8
                         3      0.2    0.4    1.0    0.6
                         4      0.2    0.8    0.6    1.0
PG

View solution in original post

4 REPLIES 4
PGStats
Opal | Level 21

proc distance gets you close ...

 

data have;
input subj $ (res1-res5) (:$1.);
datalines;
1 T F T T F 
2 T F F F T
3 F T F T T 
4 F F F F T
;

proc distance data=have out=want method=match shape=square;
id subj;
var nominal (res1-res5);
run;

proc print data=want noobs; run;
                        subj     _1     _2     _3     _4

                         1      1.0    0.4    0.2    0.2
                         2      0.4    1.0    0.4    0.8
                         3      0.2    0.4    1.0    0.6
                         4      0.2    0.8    0.6    1.0
PG
Ksharp
Super User
data have;
input subj $ (res1-res5) (:$1.);
datalines;
1 T F T T F 
2 T F F F T
3 F T F T T 
4 F F F F T
;
data temp;
 set have;
 array x{*} res:;
 do i=1 to dim(x);
   do j=i+1 to dim(x);
    if x{i}=x{j} then do;a=vname(x{i});b=vname(x{j});output; end;
   end;
 end;
keep a b;
run;
proc freq data=temp noprint;
table a*b/out=temp1;
run;
data temp2(index=(a));
 set temp1;
 output;
 temp=a;a=b;b=temp;output;
 drop temp;
run;

proc transpose data=temp2 out=temp3(drop=_:);
by a;
id b;
var count;
run;
proc sql noprint;
select a into : list separated by ' ' from temp3;
quit;
data temp4;
 retain a &list;
 set temp3;
run;
proc stdize data=temp4 out=want missing=0 reponly;
run;

Assuming I understand your question .

richart
Fluorite | Level 6

This works perfectly as well. Thanks!

ballardw
Super User

@richart wrote:

Hello,

 

I have approximately 20 subjects and 30 questions (True or False responses). My goal is to tabulate a respondent-by-respondent matrix, in which each cell would have the number of identical responses per individual. Something like this:


sas1.PNG

 

!  


So what does 1,2, 3 as column header or the 13 mean in first row? I am really not sure what you are actually counting. Define "identical response per individual". Perhaps if you provided a small example such as a data step with 3 individuals, 4 questions and what the result matrix looks like.

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