2016-01-13 211 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'。 –