использовать SAS, чтобы найти записи как можно ближе к данному наблюдению в двух наборах данных - PullRequest
0 голосов
/ 12 августа 2011

У меня есть два набора данных, один является подмножеством другого.

Например, скажем, у меня есть

Основная таблица:

Name,status,date
john,born,1-08-2011
frank,alive,1-08-2011
john,alive,1-09-2011
frank,alive,1-09-2011
frank,alive,1-10-2011
john,dead,1-11-2011
frank,alive,1-11-2011

Подстоль

frank,alive,1-11-2011
john,dead,1-11-2011

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

Итак, моя таблица результатов мне нужна

frank,alive,1-10-2011
john,alive,1-09-2011 (since he didn't get a record entry on 1-10)

И затем в идеале подавлять / удалять записи, в которых статус лиц не изменился.

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

Вот другой подход с использованием SQL:

proc sql;
 select a.*
 from master a, sub b
 where a.name=b.name and a.date<=b.date
 group by a.name
 having a.date=max(a.date);
quit;

Это просто выбирает записи в таблице master с наибольшей датой, которая меньше даты в таблице sub.

2 голосов
/ 12 августа 2011

Вы можете сделать это в два прохода.

Первый шаг - сортировка ваших данных.

proc sort data=dataset;
    by name date;
run;

Как только ваш набор данных отсортирован, вы можете использовать шаг данных для его итерации и использовать «первый». и "последний" метапеременные.

data second_to_last(drop=last_name last_status last_date);
    retain last_name '' last_status '' last_date .;
    set dataset;
    by name date;
    if first.name then do;
        last_name = '';
        last_status = '';
        last_date = .;
    end;
    if last.name and last_name != '' then do;
        name = last_name;
        status = last_status;
        date = last_date;
        output second_to_last;
    end;
    last_name = name;
    last_status = status;
    last_date = date;
run;

Каждый раз, когда шаг данных повторяется с «first.name» как true, он очищает сохраняемые переменные. Непосредственно перед концом группы имен, когда «last.name» имеет значение true, он вернет переменные обратно в прежние значения (если была предыдущая строка) и выведет строку.

...