我有一个有关成绩的sas数据集。以下是一个子集:
Name: Grade: Subject:
Bob 8 English
Bob 6 Maths
Bill 7 English
Joe 9 Maths
有没有办法可以找到每人的平均成绩? 我知道用另一种语言可以按名称分组,最后以
Name: Grade:
Bob 14
Bill 7
Joe 9
然后求出平均值,即sum(grade)/ len(grade),以得出每人的平均成绩,即(30/3 = 10)。
请注意,在此示例中,我的某些观察多次出现,例如“鲍勃”,这就是为什么需要“分组依据”方法的原因。
在sas中有没有办法做到这一点?
答案 0 :(得分:1)
我向您展示了标准SAS数据集上的示例。 您必须事先按要分组的变量进行排序
proc sort data=sashelp.class out=class(keep=Sex Name Weight);
by sex;
run;
接下来添加一些保留变量(保留“下一个”行中的值)并使用last
或first
表达式进行条件处理
data res;
set class;
by sex;
retain sum 0 n 0;
sum+Weight;
n+1;
if last.sex then
do;
avg=sum/n;
n=0;
Sum=0;
end;
run;
结果
+---------+-----+--------+-------+---+--------------+
| Name | Sex | Weight | sum | n | avg |
+---------+-----+--------+-------+---+--------------+
| Alice | F | 84 | 84 | 1 | . |
| Barbara | F | 98 | 182 | 2 | . |
| Carol | F | 102.5 | 284.5 | 3 | . |
| Jane | F | 84.5 | 369 | 4 | . |
| Janet | F | 112.5 | 481.5 | 5 | . |
| Joyce | F | 50.5 | 532 | 6 | . |
| Judy | F | 90 | 622 | 7 | . |
| Louise | F | 77 | 699 | 8 | . |
| Mary | F | 112 | 0 | 0 | 90.111111111 |
| Alfred | M | 112.5 | 112.5 | 1 | . |
| Henry | M | 102.5 | 215 | 2 | . |
| James | M | 83 | 298 | 3 | . |
| Jeffrey | M | 84 | 382 | 4 | . |
| John | M | 99.5 | 481.5 | 5 | . |
| Philip | M | 150 | 631.5 | 6 | . |
| Robert | M | 128 | 759.5 | 7 | . |
| Ronald | M | 133 | 892.5 | 8 | . |
| Thomas | M | 85 | 977.5 | 9 | . |
| William | M | 112 | 0 | 0 | 108.95 |
+---------+-----+--------+-------+---+--------------+
答案 1 :(得分:1)
您可以直接通过SAS中的SQL执行此操作。
proc sql noprint;
create table Avg_Grades as
select Name, mean(grade) as Avg_Grade
from have
group by Name
;
quit;
答案 2 :(得分:1)
在数据步骤中这样的事情
/*sorting*/
proc sort data=have out=have1;
by name;
run;
data want(drop=new_grade);
do until(last.name);
set have1(rename=(grade=new_grade));
by name;
grade = sum(new_grade, grade);
end;
run;
或在proc sql中
proc sql;
create table want as
select name, sum(grade) as grade
from have
group by name;
答案 3 :(得分:1)
这里最好的方法是使用汇总过程,尤其是如果您需要统计数据而不只是均值。请注意,如果您使用CLASS语句,则不必对数据进行预排序。
ODS OUTPUT->将结果发送到名为WANT的表中。
proc means data=sashelp.class NWAY N MEAN NMISS MEDIAN STACKODS;
CLASS sex; *this is your grouping variable(s), ie name;
VAR height; *this is the variable(s) you want to summarize;
ods output summary = want;
run;