Группировка данных в SAS в заданные c сегменты - PullRequest
0 голосов
/ 13 января 2020

Мне нужна помощь, чтобы удовлетворить приведенное ниже требование

Currentdataset (имя набора данных: SAS1):

product_no product_type status1 status2
12345      3            x       0
12345      1            x       1
123456     3            x       1
123456     6            x       0
9876       3            x+1     0
9876       1            x+1     0

Таким образом, в основном, в приведенном выше наборе данных, если status2=1 and status1='x' and product_type<>3, то для обе строки, status1 должно быть 'nr'. если status2=1 and status1='x' and product_type=3, то для обеих строк status1 должно быть 'x+1'. если status2=0 and status1='x+1', то для обеих строк значение status1 должно быть 'x+1'

Желаемый вывод (имя набора данных: SAS2):

product_no product_type status1 status2
12345      3            nr      0
12345      1            nr      1
123456     3            x+1     1
123456     6            x+1     0
9876       3            x+1     0
9876       1            x+1     0

КОД ПРОВЕРЕН, НО ЭТО СДЕЛАНО ' T WORK:

proc sql;create table sas2 as 
select 
    a.*,
    case
    when status2=0 and status1='x+1' then 'x+1'
    WHEN status2=1 and  status1='x' and product_type=3 then 'nr'
    WHEN status2=1 and  status1='x'  and product_type ne 3 then 'x+1'
    WHEN status2=1 and  status1='NotActive' then 4
END AS status3 FROM sas1 AS a;quit;

Приведенный выше код не работает. Так, например, для product_no = 12345 условие выполняется только для этой конкретной строки, а не для всей группы. Таким образом, для product_no = 12345 столбец status1 = 'nr' должен быть заполнен для обеих строк, а не только для одной.

1 Ответ

0 голосов
/ 14 января 2020

Похоже, что вам потребуется некоторая группировка, чтобы применить вычисленное значение к «двум» строкам. Из данных выборки только две группы строк будут основаны на product_no. Суммирование логической оценки по группе скажет вам, удовлетворяет ли какой-либо из строк в группе критериям. Proc SQL Запросы также будут выполнять автоматическое повторное объединение c, когда выполняется неагрегированный выбор, когда указано условие group by. Оператор case вычисляет значение status1 на основе первого встречающегося условия условия оператора case

Пример:

data have;input
product_no product_type status1 $ status2 ; datalines;
12345      3            x       0
12345      1            x       1
123456     3            x       1
123456     6            x       0
9876       3            x+1     0
9876       1            x+1     0
run;

proc sql;
  create table want as
  select 
    product_no
  , product_type
  , case 
      when sum(status2=1 and status1='x' and product_type ne 3) > 0 then 'nr'
      when sum(status2=1 and status1='x' and product_type eq 3) > 0 then 'x+1'
      when sum(status2=0 and status1='x+1') > 0 then 'x+1'
      else status1
    end as status1
  , status2
  from have
  group by product_no
  ;
...