2016-12-20 3 views
-1

Я немного смущен насчет слияния в SAS. Например, когда люди используют оператор слияния, иногда следуют (in=a) или (in=b). Что это точно?Использование merge in sas

+0

... Вы посмотрели документацию о слиянии? – Chris

ответ

0

Допустим, у вас есть MERGE A (in=INA) B (in=INB);

При объединении двух наборов данных с BY заявления, вы можете иметь следующие ситуации:

Dataset А имеет наблюдение с заданным по значению и набор данных B не делает. В этом случае INA будет истинным, а INB будет ложным.

Данные набора данных A и B имеют наблюдение с заданной величиной. В этом случае INA и INB будут истинными.

[Отредактировано для исправления ошибок] Данные набора А и В имеют разные количества наблюдений с заданной величиной. Предположим, что у A больше B. Даже после того, как B закончит наблюдения, ИАА и INB будут истинными. Если вы хотите знать, есть ли у B наблюдения, вам нужно что-то вроде следующего кода. Как отметил @Tom, вы часто хотите знать, какой набор данных вносит вклад.

data want; 
    ina=0; 
    inb=0; 
    merge a (in=ina) b (in=inb); 
    by mybyvariable; 
    ... 
run; 

Приведенный выше код использует тот факт, что SAS сохраняет переменные из последнего наблюдения способствовали по-группы с помощью набора данных с меньшим числом наблюдений. Если вы повторно инициализируете любую из переменных перед оператором MERGE, и нет нового наблюдения, они будут сохранять свои повторно инициализированные значения; но если появится новое наблюдение, SAS сбросит их. Я надеюсь, что в этом есть смысл.

Dataset A не имеет наблюдения с заданной величиной и B делает. В этом случае INA будет ложным, и INB будет правдой.

Обратите внимание, что это не касается ситуации слияния без инструкции BY.

+0

Если два набора данных вносят разное количество наблюдений в одну и ту же группу BY, переменные IN = будут соответствовать всем наблюдениям. Внутри группы наблюдения сопоставляются один за другим. И если в одном наборе данных меньше наблюдений, то значения переменных этого набора данных из этого последнего наблюдения сохраняются, так как с других входов (-ов) считываются больше наблюдений. Это именно то, что вы хотите при слиянии с 1 по N. Но это удивительно и обычно не то, что нужно при слиянии N-M. – Tom

+0

@ Тома, вы правы. У меня появилось ошеломляющее чувство, что я ошибался, и я буду более осторожен в будущем, чтобы проверить мои ответы. Благодаря! Я отредактирую ответ, чтобы сделать его правильным. – vknowles

1

Чтобы подробнее рассказать о vknowles, in=a и in=b полезны при различных типах слияний. Скажем, у нас есть следующий шаг данных:

data inner left right outer; 
    merge have1(in=a) have2(in=b); 
    by ...; 
    if a and b then output inner; 
    else if a and not b then output left; 
    else if not a and b then output right; 
    else if not (a or b) then output miss; 
run; 

Стадия данные будет создавать 4-х различные наборы данных, которые являются основой внутреннего соединения, соединений слева и справа присоединиться.

  • выход будет утверждение if a and b then output inner; только записи, в которых ключ найден в наборах данных have1 и have2, который является эквивалентом SQL внутреннего соединения.
  • else if a and not b then output left; выводит только записи, которые встречаются в наборе данных have1, а не в has2. Это эквивалент левого внешнего соединения в SQL. Если вы хотите получить полное левое соединение, вы можете либо добавить набор данных left в набор данных inner, либо просто изменить оператор на if (a and b) or (a and not b) then output left.
  • Третий else if является как раз противоположным предыдущему. Здесь вы можете выполнить правильное объединение данных.
  • Последний else if будет выводить на набор данных outer, который является эквивалентом внешнего соединения. Это полезно для целей отладки, поскольку ключ уникален для каждого набора данных. Спасибо Роберту за это дополнение.
+0

Вы забыли самую полезную комбинацию для отладки различий (т. Е. Когда слияние ключа не существует в обеих исходных таблицах). 'if not (a или b) then output diff;' –

+0

@RobertPenridge Спасибо за предложение, я обновил ответ, чтобы включить его. –

0

Когда вы видите набор данных, на который ссылается SAS с (), после него элементы внутри называются параметрами набора данных. Опция набора IN= действительна при чтении наборов данных с использованием операторов, таких как SET, MERGE, UPDATE. Слово, следующее за IN=, называет переменную, создаваемую SAS, которая будет истинна (1), когда этот набор данных вносит вклад в текущее наблюдение и false (0) в противном случае.

Хорошим примером может быть, если вы хотите использовать один набор данных для подмножества другого. Например, если вы хотите объединить данные из основной таблицы поиска, чтобы добавить дополнительную переменную, такую ​​как адрес или тип учетной записи, но не добавили в каждый идентификатор из таблицы поиска.

data want; 
    merge my_data(in=in1) master_lookup (in=in2); 
    by id; 
    if in1 ; 
run; 

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

data want; 
    set one(in=in1) two(in=in2); 
    by id; 
    if in1 then source='ONE'; 
    if in2 then source='TWO'; 
run;