2016-05-31 5 views
0

У меня есть таблица, которая содержит информацию, которая, конечно же, выбрана в 2 семестра каждого учащегося. Те студенты, не проверяли свой первый семестр, так что все valid_or_not_of_semester='N' для semester='1st':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 
-------------------------------------------------------------------------- 

Каждая строка обозначает числа студентов, которые не подтвердило первый семестр и выбрал курс в первом семестре. И столбцы разделяют студентов, которые выбрали курс действительным и недействительным своего второго семестра. Чтобы быть более точным,

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

Я попытался ргос 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; 
Смежные вопросы