* Two types of match merging; /* One to one match merge */ data tests; INPUT student $ period test1-test3; lines; John 1 87 92 92 Billy 2 92 84 83 Susan 2 81 93 100 Arnold 1 72 83 72 Barbara 1 91 72 84 Johnny 3 62 79 80 Sandra 3 98 74 90 ; run; data homework; INPUT student $ period hw1-hw4; lines; John 1 8 7 3 5 Billy 2 9 7 9 10 Susan 2 9 6 9 8 Arnold 1 7 9 6 10 Barbara 1 6 9 7 8 Johnny 3 6 8 3 7 Sandra 3 9 10 8 9 ; run; proc sort data=tests; by student; proc sort data=homework; by student; data allgrade; merge tests homework; by student; run; proc print data=allgrade; title 'Combined Tests and HW'; run; /* One-to-many match merge */ data class; input period ex_cr_test3 ex_cr_hw4; lines; 1 5 2 2 10 3 3 5 1.5 ; run; proc sort data=allgrade; by period; run; DATA adjgrade; merge allgrade class; BY period; test3 = test3 + ex_cr_test3; test_avg = mean(OF test1-test3); hw4 = hw4 + ex_cr_hw4; hw_avg = mean(OF hw1-hw4); proc print data=adjgrade; title 'Gradebook after Adjustments'; run; /* Merging summary statistics and data */ PROC SORT data=adjgrade; BY period; run; PROC MEANS data=adjgrade MEAN RANGE noprint; VAR test_avg hw_avg; BY period; OUTPUT OUT = period_stats MEAN(test_avg) = period_mean_test MEAN(hw_avg) = period_mean_hw RANGE(test_avg) = period_range_test RANGE(hw_avg) = period_range_hw; run; /* Grades centered relative to period mean */ DATA gradeplus; MERGE adjgrade period_stats; BY period; Centered_test_avg = test_avg - period_mean_test; Centered_hw_avg = hw_avg - period_mean_hw; run; proc print data=gradeplus; VAR student period test_avg hw_avg period_mean_test period_mean_hw period_range_test period_range_hw Centered_test_avg Centered_hw_avg; title 'Student grades, with by-period data'; run; /* Merging grand totals and data */ PROC MEANS data=adjgrade MEAN SUM noprint; VAR test_avg hw_avg; OUTPUT OUT = grand_stats MEAN(test_avg) = overall_mean_test SUM(hw_avg) = grand_sum_hw; run; proc print data=grand_stats; title 'Grand Mean Test and Grand Sum HW'; run; DATA moregrade; IF _N_=1 THEN SET grand_stats; SET adjgrade; Centered_test_avg = test_avg - overall_mean_test; Student_hw_percent = (hw_avg/grand_sum_hw)*100; PROC PRINT data=moregrade; VAR student period test_avg hw_avg overall_mean_test grand_sum_hw Centered_test_avg Student_hw_percent; title 'Student grades, relative to grand mean test and grand sum HW'; run;