根据 Proc Sql ,SAS 中的条件将一列拆分为两列

Splitting a Column into two based on condtions in Proc Sql ,SAS

我想将航空公司列拆分为两组,然后 为所有客户添加每个组的金额...:-

第 1 组 = 印度航空公司和喷气航空公司 |第 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;

您正在根据航空公司的第一个词对一行进行分类。

Proc TRANSPOSEID 语句是重塑数据以使分类值成为列的一种常用方法。第二种方法是绕过分类并使用数据步骤直接生成新的数据形状。

这是第二种方式的示例 -- 创建新列 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
;