2016-01-13 37 views
0

这是一个非常基本的问题,但我找不到一个简单的方法来完成它。 我有一个数据集的引用不同,高中学生:SAS数据集:匹配IF条件的计数观察

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

任何想法?

回答

0

首先,你必须通过高中到您的数据集进行排序:

proc sort data = your_dataset; 
    by Highschool; 
run; 

然后使用

    - 保留不复位Nb_m和Nb_f在每一个记录;
    - 最后函数和 输出声明只打印每个学校的最后一次观察。
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; 
+0

太棒了!非常感谢Matteo。 还有一个问题:为什么在do语句中重置Nb_m和Nb_f? – Pierre

+0

因为如果我不在下一个高中重置他们,我会保留上一个男性和女性的数量:在你的情况下,它会正确计数'A'的男性/女性,但它会返回Nb_m = 7和学校'B'的Nb_f = 5。 –

1

您可以在一个单一的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 ; 
+0

你是对的,我不需要这些信息。我不习惯SQL,但这看起来很优雅。这项工作是否会增加条件?例如:当Sexe ='f'&condition =“1”那么......? – Pierre

+0

是的,你可以添加任何额外的逻辑到'case when when'; 'case when(condition [s])then true_val else false_val end'。 –