В основном нужно вычесть два набора данных в базовый sas (proc sql) - PullRequest
0 голосов
/ 30 января 2019

Сначала я создал набор данных 'иметь'.Затем я отсортировал этот набор данных (есть).Вновь создал набор данных 'havenot'. Теперь, в принципе, мне нужно вычесть два набора данных ('have' и 'havenot').

data have;
input party_ID  Preference_ID:$11.;
datalines;
 101 Preference1
 101 Preference2
 102 Preference4
 102 Preference1
 102 Preference5
;

proc sort data = have;
by party_ID Preference_ID;
run;

data havenot;
set have;
by party_ID Preference_ID;
if first.party_id;
run;

(выходной)

party_ID Preferenece_ID
101 Preference1
102 Preference1

Требуемый вывод, который я хочу

party_ID Preference_ID
101 Preference2
102 Preference4
102 Preference5

Ответы [ 3 ]

0 голосов
/ 30 января 2019

в основном вы можете сделать, если не first.variable даст желаемый набор данных

data other;
  set have;
by party_ID Preference_ID;
if not first.party_id;
run;
0 голосов
/ 30 января 2019

Самый простой вариант - использовать шаг данных:

data output;
  merge have(in=i1) havenot(in=i2);
  by party_ID Preference_ID;
  if not i2;
run;

Если вы хотите использовать proc sql, вы можете сделать следующее:

proc sql noprint;
  create table output as
  select a.*
  from have as a
  full outer join havenot as b
  on a.party_ID eq b.party_ID and a.Preference_ID eq b.Preference_ID
  where b.party_ID is missing;
quit;
0 голосов
/ 30 января 2019

Вы спрашиваете, как удалить первую запись для PARTY_ID?

Вы можете просто изменить логику в своем выражении IF для поднабора.

data want;
  set have;
  by party_id;
  if not first.party_id;
run;

Или другой способ - явно удалитьпервые наблюдения.

if first.party_id then delete;

Если вы спрашиваете, как удалить точные совпадения строк, PROC SQL может сделать это.

proc sql ;
  create table want as 
    select * from have
    except
    select * from havenot
  ;
quit;

Если вы хотите удалить строки, основанные только на совпадениях ключей, томожет быть лучше в шаге данных.

data want ;
   merge have havenot(in=in2 keep=party_id preference_id);
   by party_id preference_id;
   if not in2;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...