2016-05-31 7 views
0

私は、各学生の2つの学期に選択されたコースの情報を含むテーブルを持っています。これらの学生は彼らの最初の学期を検証し、そのsemester='1st'のためのすべてのvalid_or_not_of_semester='N'ませんでした:変数の別の値のSAS proc freq

student semester course_selected valid_or_not_of_semester 
    A   1st   math    N 
    A   1st   english   N 
    A   2nd   math    Y 
    A   2nd   english   Y 
    B   1st   math    N 
    B   2nd   math    Y 
    B   2nd   english   Y 
    C   1st   math    N 
    C   2nd   math    N 

math(またはenglish)を選択し、それらの学生のために最初の学期では、私は彼らがmathを選択した場合は調査したい(またはenglish)第二学期には、そうならば、私は彼らの第二学期を検証したりされていないものの学生の数をカウントする、クロス集計を作成するつもりです:

-------------------------------------------------------------------------- 
    1st semester \ 2nd semester |   Math  | English 
    invalid  \    |---------------------|-------------------- 
    students  \   | valid | invalid | valid | invalid 
-------------------------------------------------------------------------- 
      Math     | 2 | 1  | 2 |  0 
-------------------------------------------------------------------------- 
     English    | 1 | 0  | 1 |  0 
-------------------------------------------------------------------------- 

各行は数を表します学生たち最初の学期を検証せず、最初の学期にコースを選択しました。そして、第2学期の有効期間と無効期間にコースを選択した学生は、列を分離します。具体的には、

-------------------------------------------------------------------------- 
    1st semester \ 2nd semester |   Math  | English 
    invalid  \    |---------------------|-------------------- 
    students  \   | valid | invalid | valid | invalid 
-------------------------------------------------------------------------- 
      Math     | 2 |  1  | 2 |  0 
            |   |   | 
            \/  \/  \/
         (students A&B) (student C) (students A&B) 

私はPROCのSQLを試してみました:

data math; 
    merge have 
    have (where=(semester='1st') in=these); 
    by student; 
    if these then output; 
run; 

proc sql; 
    create table result as 
    select count(distinct student) as nb_student 
    from math (where=(semester='2nd')) 
    group by course_selected, valid_or_not_of_semester; 
quit; 

そしてenglishのために同じことを行います。

しかし、2つのコースの結果を直接得る方法はありますか?どのように私はproc freqを使用できますか?

あなたの答えを得ることを願っています。

答えて

1

これは正確にあなたが探していたテーブルを提供するものではありませんが、興味があった値を生成します。元のデータセットを転置し、その後観測値をカウントすることです。

特定の状況下で生徒を二重にカウントしているため、問題が発生する可能性がありますが、proc tabulateを調べることもできます。

data temp; 
    input student $ semester $ course_selected $ valid_or_not_of_semester $; 
    datalines; 
    A 1st math N 
    A 1st english N 
    A 2nd math Y 
    A 2nd english Y 
    B 1st math N 
    B 2nd math Y 
    B 2nd english Y 
    C 1st math N 
    C 2nd math N 
    ; 
    proc sort; by student; 
run; 

proc transpose data = temp out = temp2; 
    by student; 
    id course_selected semester; 
    var valid_or_not_of_semester; 
run; 

proc sql; 
    create table temp3 as select distinct 
     sum(case when math1st = "N" and math2nd = "Y" then 1 else 0 end) as math_math_valid, 
     sum(case when math1st = "N" and math2nd = "N" then 1 else 0 end) as math_math_invalid, 
     sum(case when english1st = "N" and math2nd = "Y" then 1 else 0 end) as english_math_valid, 
     sum(case when english1st = "N" and math2nd = "N" then 1 else 0 end) as english_math_invalid, 
     sum(case when math1st = "N" and english2nd = "Y" then 1 else 0 end) as math_english_valid, 
     sum(case when math1st = "N" and english2nd = "N" then 1 else 0 end) as math_english_invalid, 
     sum(case when english1st = "N" and english2nd = "Y" then 1 else 0 end) as english_english_valid, 
     sum(case when english1st = "N" and english2nd = "N" then 1 else 0 end) as english_english_invalid 
     from temp2; 
quit; 
関連する問題