Разделение столбца на две части в зависимости от условий в Proc Sql, SAS - PullRequest
0 голосов
/ 08 мая 2018

Я хочу разделить колонку авиакомпаний на две группы, а затем Добавьте сумму каждой группы для всех клиентов ...: -

Группа 1 = Air India & jet airways | Группа 2 = Другие.

Loc  Client_Name     Airlines           Amout
BBI   A_1ABC2        Air India          41302
BBI   A  1ABC2       Air India          41302
MAA   Th 1ABC2       Spice Jet Airlines 288713
HYD   Ma 1ABC2       Jet Airways        365667
BOM   Vi 1ABC2       Air India          552506

Примерно так: -

Rank    Client_name Group1  Group2  Total   
1       Ca 1ABC2    5266269 7040320 1230658 
2       Ve 1ABC2    2815593 2675886 5491479 
3       Ma 1ABC2    1286686 437843  1724529 
4       Th 1ABC2    723268  701712  1424980 
5       Ec 1ABC2    113517  627734  741251  
6       A  1ABC2    152804  439381  592185  

Сначала я сгруппировал его, но я не уверен, как разделить: -

Data assign6.Airlines_grouping1;
Set assign6.Airlines_grouping;

if Scan(Airlines,1) IN ('Air','Jet') then Group = "Group1";
else
if Scan(Airlines,1) Not in('Air','Jet') then Group = "Group2";

Run;

1 Ответ

0 голосов
/ 08 мая 2018

Вы классифицируете строку на основе первого слова авиакомпании.

Proc TRANSPOSE с оператором ID - это один из распространенных способов изменить данные таким образом, чтобы категориальное значение стало столбцом. Второй способ - обойти классификацию и использовать шаг данных для непосредственного создания новой формы данных.

Вот пример второго способа - создать новые столбцы group1 и group2 и установить значение на основе критериев авиакомпании.

data airlines_group_amounts;
  set airlines;

  if scan (airlines,1) in ('Air', 'Jet') then
    group1 = amount;
  else
    group2 = amount;
run;

Подвести итог по клиенту

proc sql;
  create table want as
  select
    client_name
  , sum(group1) as group1
  , sum(group2) as group2
  , sum(amount) as total
  from airlines_group_amounts
  group by client_name
;

Вы можете избежать двух шагов и выполнить всю обработку в одном запросе, или вы можете выполнить суммирование с помощью Proc MEANS

Вот один способ запроса.

proc sql;
  create table want as
  select
    client_name
  , sum(case when scan (airlines,1) in ('Air', 'Jet') then amount else 0 end) as group1
  , sum(case when scan (airlines,1) in ('Air', 'Jet') then 0 else amount end) as group2
  , sum(amount) as total
  from airlines
  group by client_name
;
...