2014-09-07 6 views
0

Мой первый набор данных SAS, ds1 содержит даты, фирмы и цены акций. Мой второй набор данных, ds2 содержит подмножество фирм в ds1. Я хотел бы создать ds3, который содержит все наблюдения в ds1, если фирма ds1 также находится в ds2. Я стараюсь делать это следующим образом:Удаление наблюдений, которые не являются частью списка в SAS

DATA ds3; set ds1; IF firm IN (d2); run;

Вышесказанное не работает, как и планировалось, как ds3 заканчивается, не содержащий каких-либо замечаний. Я считаю, что проблема заключается в заявлении IF IN. Я мог бы вручную набирать все фирмы в скобках вместо того, чтобы ставить d2 там, но это было бы очень неэффективно для меня.

ответ

1

У вас есть несколько вариантов здесь; правильный выбор во многом зависит от ваших конкретных потребностей.

Что вы эффективно делаете, так это объединение двух таблиц. Таким образом, MERGE или SQL JOIN будут простым решением.

data ds3; 
    merge ds1(in=_ds1) ds2(in=_ds2 keep=firm); 
    by firm; 
    if _ds1 and _ds2; 
run; 

Это присоединяется DS1 и ds2, только сохраняя firm переменную из ds2, и сохраняет только фирмы, которые в обоих. И DS1, и DS2 необходимо сортировать by firm;, а DS2 должен иметь только уникальные значения firm - нет дубликатов.

SQL также довольно легко.

proc sql; 
    create table ds3 as 
    select * from ds1 where exists (
     select 1 from ds2 
     where ds1.firm=ds2.firm 
    ); 
quit; 

Это немного ближе к терминологии (заурядный, как SQL пытается быть ближе к естественному языку для многих простых запросов). Это не требует ни сортировки, ни уникальности, хотя это не будет особенно быстро.

Вы также можете сохранить фирмы DS2 в формате или использовать хеш-таблицу, чтобы вы могли открыть DS2 вместе с DS1. Вы также можете использовать оператор набора ключей. Все они немного сложнее реализовать, но, как правило, быстрее, поскольку они не требуют сортировки и не повторяют ссылки на те же данные, что и SQL.

Смежные вопросы