Как вы сравниваете наблюдения, имеющие общую часть ключа в SAS? (я. c. та же семья, другой ребенок) - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть такой набор данных

Family Student Age    Grade

1       Bob     10     4
1       Kris    12     5
1       Tracy   15     9

В этом наборе есть много других семейств. Мне нужно найти братьев и сестер пятого класса и создать новую переменную, в которой будет указана разница в возрасте между братом и пятым классом. Это упражнение включает в себя слияние наборов.

Набор «школа» содержит всех учащихся, а у «пятиклассников» есть только пятый класс. Я знаю, как их объединить, но я застрял на том, чтобы найти их братьев и сестер и вычесть их возраст.

data mergeStudents
   set school fifthgraders
   by student
run;

1 Ответ

0 голосов
/ 14 апреля 2020

Ваш код не работает, потому что

  • вы обрабатываете данные by student, а не by family
  • вы читаете fifthgraders перед их братьями и сестрами

Во-вторых, мне интересно, почему вы попытались создать отдельный набор данных только для пятиклассников. Очевидно, вы не знаете о предложении where в параметрах набора данных.

Лучшим решением было бы

data mergeStudents;
    set shool (where =(Grade eq 5) in = grade_5)
        shool (where =(Grade ne 5) in = sibling);
    by Family;
    retain age_5;                   * do not nullify when reading the next observation ;
    if first.Family then age_5 = .; * forget the data about the previous family;
    if grade_5 then age_5 = Age;    * remember the age of the fifth grager in the family;
                                    * For a family with two fifth graders, this will be the last one in the dataset;
                                    * By sorting 'by Family age' first, you can force it to be the oldest one;
    if sibling then do;
        age_difference = age - age_5;
        output;                     * If you write an output statement in a dataset, ;
                                    * only observations for which the output statement is executed will be in the result;
    end;
run;
...