SAS 数据集:计数符合 IF 条件的观察

SAS Dataset : Counting observation that match an IF condition

这是一个非常基本的问题,但我找不到简单的方法来解决这个问题。 我有一个引用不同高中和学生的数据集:

Highschool Students Sexe A 1 m A 2 m A 3 m A 4 f A 5 f B 1 m B 2 m

我想创建两个新变量来计算每所学校的男性和女性人数:

Highschool Students Sexe Nb_m Nb_f A 1 m 1 0 A 2 m 2 0 A 3 m 3 0 A 4 f 3 1 A 5 f 3 2 B 1 m 1 0 B 2 m 2 0

我终于可以提取最后一行的总数,如下所示:

Highschool Students Sexe Nb_m Nb_f A 5 f 3 2 B 2 m 2 0

有什么想法吗?

首先,您必须按 Highschool:

对数据集进行排序
proc sort data = your_dataset;
    by Highschool;
run;

那你用

    - 保留 不在每条记录中重置 Nb_m 和 Nb_f;
    - last 函数和 output 语句只打印每所学校的最后一次观察。
data new_dataset;
    set your_dataset;
    by Highschool;
    retain Nb_m Nb_f;
    if Sexe = 'm' then
        Nb_m + 1;
    else
        Nb_f + 1;
    if last.Highschool then do;
        Students = Nb_m + Nb_f;
        output;
        Nb_m = 0;
        Nb_f = 0;
    end;
run;

您可以在一个 PROC SQL 步骤中完成此操作...

此外,我认为您真的不需要最后一行的 Sexe 值。

proc sql ;
  create table want as
  select Highschool, 
         sum(case when Sexe = 'f' then 1 else 0 end) as Nb_f,
         sum(case when Sexe = 'm' then 1 else 0 end) as Nb_m,
         Nb_f + Nb_m as Students
  group by Highschool
  order by Highschool ;
quit ;