我有一个有关成绩的SAS数据集。 以下是一个子集:

 Name:     Grade:      Subject:   
Bob         8         English
Bob         6         Maths
Bill        7         English
Joe         9         Maths

有没有办法可以找到每人的平均成绩? 用另一种语言,我知道我会按名称分组,最后得到

 Name:     Grade:       
Bob         14                      
Bill        7         
Joe         9     

然后找到平均值,即总和(等级)/ len(等级),以获得每人的平均等级,即(30/3 = 10)。

请注意,在此示例中,我的某些观察多次出现,例如“鲍勃”,这就是为什么需要“分组依据”方法的原因。

有没有办法在sas中做到这一点?

#1楼 票数:2 已采纳

数据步骤中这样的事情

/*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;

#2楼 票数:1

我为您展示了标准SAS数据集上的示例。 您必须事先按要分组的变量进行排序

proc sort data=sashelp.class out=class(keep=Sex Name Weight);
by sex;
run;

接下来添加一些保留变量(保留“下一个”行中的值)并使用lastfirst表达式进行条件处理

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 |
+---------+-----+--------+-------+---+--------------+

#3楼 票数:1

您可以通过SAS中的SQL直接执行此操作。

proc sql noprint;
    create table Avg_Grades as
        select Name, mean(grade) as Avg_Grade
        from have
        group by Name
        ;
quit;

#4楼 票数:1

此处最好的方法是使用汇总过程,尤其是如果您需要统计数据而不是均值。 请注意,如果您使用CLASS语句,则不必对数据进行预排序。

  1. 在PROC MEANS语句上,有几个选项:
    • NWAY-仅包括最高级别,否则SAS也将添加总体总计
    • N / MEAN / NMISS / MEDIAN-要准备的统计数据
    • STACKODS更改输出格式,这通常是大多数人想要的格式。
  2. CLASS->分组变量
  3. VAR->要分析的变量
  4. 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; 

  ask by Will.S89 translate from so

未解决问题?本站智能推荐:

2回复

当观察不包含SAS中的某些值时删除组

参考下表,如果 ID 组中至少有一个具有第 1 天到第 3 天(允许重复),则该 ID 被认为是完整的。 我需要删除组没有完整的第 1 天到第 3 天的 ID。 预期结果 使用此参考, 删除其观察结果均不包含 SAS 中的特定值的组,我在下面的代码中尝试过,但它无法删除 ID 2。
2回复

跨观察条件和SAS分组搜索

我有以下数据集: 我试图对每个类型保留两个观测值:每个类型的第一个,以及TYPE的NumDays值首次大于90。 其余的我想删除。 因此,在这种情况下,我想删除第二和第六个观测值。 我试图通过set和“ by”使用数据步骤来使用FIRST.Type和LAST.Type的值,但不知道如
2回复

在SAS中按几个变量分组

我想总结代理商,订单和日期之间的销售额。 下面的代码运行,但是,我只收到total列的重复而不是总和。 有什么建议吗? 码:
3回复

在子查询SAS中按分组

嗨,我有一个像这样的数据集 我想获得每个类别中每个品牌的市场份额。 假设类别1中A的市场份额为3/6 = 50%。 我用了sql代码 但SAS报告错误 请帮忙。 非常感谢!
1回复

在SAS中按组获取最新的课程

我在SAS中有一个数据集,可以说:ID,类,组 组有4个值:{1,2,3,4},类别{Class1,...,Class n}的数目不确定。 为每个小组找到最新课程的最快方法是什么? 我可以看到两个选项,使用Proc freq或使用类似 并在每组最多之后服用。 但是我不知道该怎么
1回复

在SAS的脚注中添加图形计数

嗨,我正在尝试在SAS中使用BY GROUP语句生成多个图形。 我想将每个图打印到以BY GROUP变量值命名的单独文件中,再加上一个脚注到每个图上,在该图上我要向图1中添加文本“此图为2300-01”,并希望将其递增1表示“此图为2300-02”的下一个图,依此类推。 放弃;
1回复

使用PROCSQL在SAS中折叠数据

我一直在尝试使用带有GROUPBY的PROC SQL来折叠数据集,并且想知道我是否能得到一些帮助。 这是我想要做的一个例子。 假设我们有以下数据: 我们希望通过id保存多年来min age的行来获取以下数据集 我尝试了一些类似的东西 无济于事。
2回复

SAS中按组的下一个值[重复]

这个问题已经在这里有了答案: 如何使用SAS对下一行的值求和? 3个答案 我正在尝试创建一个新的变量,该变量采用组中的下一个值。 特别是,我有: 我想要的输出将是: 我试图为每个客户提供柜台,但是我不确定应该从那里去哪里...