#sas
Вопрос:
У меня есть следующий набор данных SAS.
взаимосвязь | policynum | рискнум |
---|---|---|
A | X | Y |
A | X | Y |
A | X | Y |
B | X | Y |
B | X | Y |
B | X | Y |
B | X | L |
B | X | L |
B | X | L |
C | Z | M |
C | Z | M |
C | Z | M |
D | Z | M |
D | Z | M |
D | Z | M |
В SAS я хочу отфильтровать приведенный выше набор данных, чтобы получить окончательный результат в виде:
взаимосвязь | policynum | рискнум |
---|---|---|
B | X | Y |
B | X | Y |
B | X | Y |
B | X | L |
B | X | L |
B | X | L |
D | Z | M |
D | Z | M |
D | Z | M |
т. е. для каждой группы policynum
и risknum
, если существует несколько значений correlation
, я хочу сохранить второе значение и избавиться от первого значения.
Если correlation
для группы » и «существует только одно значение policynum
risknum
«и», я тоже хочу сохранить эту группу в своем окончательном выводе.
Каков был бы лучший способ сделать это? Это может быть что-то простое, так как я относительно новичок в SAS.
Заранее спасибо!
Ответ №1:
Если порядок значений корреляции в порядке сортировки совпадает с порядком их отображения по строкам в наборе данных, вы можете использовать SQL. В противном случае SQL, основанный на теории множеств, который не имеет неявных номеров строк, не может быть использован. Можно использовать шаг ДАННЫХ с циклом DOW.
Пример:
К вашему сведению, одна из распространенных ситуаций, в которой кодеры SAS используют фразу «Цикл DOW», — это когда операторы SET amp; BY встречаются внутри цикла DO.
data have;
input correlation $ policynum $ risknum $;
datalines;
A X Y
A X Y
A X Y
B X Y
B X Y
B X Y
B X L
B X L
B X L
C Z M
C Z M
C Z M
D Z M
D Z M
D Z M
;
/* keep last group of a nested group */
* SQL can be used only if correlation wanted is ALWAYS highest valued correlation;
proc sql;
create table want as
select * from have
group by policynum, risknum
having correlation = max(correlation)
;
* DATA Step DOW loops can be used when correlation wanted is last occurring correlation within by group;
data want;
do _n_ = 1 by 1 until (last.policynum);
set have;
by policynum risknum notsorted; /* presume at least contiguous */
end;
_want_correlation = correlation;
do _n_ = 1 to _n_;
set have;
if _want_correlation = correlation then OUTPUT;
end;
run;
Комментарии:
1. Спасибо, Ричард! Моя корреляция была такова, что значение, которое я хотел сохранить, было самой высокой корреляцией, поэтому ваше предложение proc sql сработало как заклинание.