извлечение из набора данных с использованием другого набора данных в SAS

У меня есть следующий набор данных FULLDS

 id  date         value
 A  "05/31/2000"   10
 B  "06/31/2000"    11

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

id  startdate enddate
A   "04/30/2000"  "05/31/2002"
etc

Я хотел бы хранить только данные в FULLDS, которые соответствуют их в NewDS и находятся только между датами начала и окончания.

Любая помощь приветствуется. Благодарю вас!


person qfd    schedule 31.01.2014    source источник


Ответы (2)


Вы можете сделать это с помощью proc sql. Следующее извлекает данные с помощью выбора:

proc sql;
    select f.*
    from FULLDS f join
         NewDS n
         on f.id = n.id and f.date between n.startdate and n.enddate;

Фактически вы можете удалить несоответствующие строки, выполнив:

proc sql;
    delete from f
        where not exists (select 1
                          from NewDs n
                          where f.id = n.id and f.date between n.startdate and n.enddate
                         ) ;
person Gordon Linoff    schedule 31.01.2014
comment
Обратите внимание, что это будет работать только в том случае, если это действительно даты, а не просто строки, в которых хранятся значения, подобные дате. Вам нужно будет добавить несколько операторов input, если нет. - person Joe; 01.02.2014

Несколько более быстрый способ сделать это (а также способ SASsy) — использовать форматы.

Возьмите NewDS, создайте новый набор данных на основе fmts или чего-то подобного, переименуйте переменные в start и end, создайте переменную label со значением 'VALID' и переименуйте ID в fmtname.

Затем proc format cntlin=fmts; quit; (fmts = имя вашего набора данных, сделанного выше).

Затем вы используете putn вот так:

data want;
set fullds;
if putn(date,id) = 'VALID';
run;

Это предполагает, что все переменные даты (в обоих наборах данных) действительно являются значениями даты, а не символьными переменными. Если да, то start, end и значение, входящее в putn, должно быть input до даты.

person Joe    schedule 01.02.2014