首页 > 解决方案 > 具有多个 VAR 选项的 SAS 转置表

问题描述

我有一张桌子,看起来像:

ID     NAME    TYPE        DATE_VALUE    STRING_VALUE      NUMBER_VALUE  
1    revenue report_date    01jan2018
1    revenue    name                     Revenue_12m
1    revenue    code                                           1100
1    revenue    sum                                           6000000

我希望它看起来像:

ID     NAME     report_date     name          code       sum
1    revenue     01jan2018    Revenue_12m     1100     6000000

我的代码给出了错误的结果(3行):

proc transpose data=tab1 out=tab2;
by id name;
var number_value string_value date_value;
id type;
run;

标签: arrayssastranspose

解决方案


考虑 SQL 中的条件聚合,假设您的类型是少数项目:

proc sql;
    create table output as
    select ID, NAME,
           MAX(case when TYPE = 'name' then STRING_VALUE else "" end) AS report_name,
           MAX(case when TYPE = 'report_date' then DATE_VALUE else . end) AS report_date format=date9.,
           MAX(case when TYPE = 'code' then NUMBER_VALUE else . end) AS code,
           MAX(case when TYPE = 'sum' then NUMBER_VALUE else . end) AS sum
    from raw
    group ID, NAME;
quit;

输入

data raw;
    infile datalines delimiter=',' DSD; 
    length NAME $ 7 TYPE $ 11 STRING_VALUE $11 NUMBER_VALUE 7;
    input ID NAME $ TYPE $ STRING_VALUE $ NUMBER_VALUE DATE_VALUE date9.;
    format DATE_VALUE DATE9.;
    datalines;
1,revenue,report_date,,.,01jan2018
1,revenue,name,Revenue_12m,.,.
1,revenue,code,,1100,.
1,revenue,sum,,6000000,.
;

输出

ID    NAME   report_name   report_date  code     sum 
 1 revenue   Revenue_12m     01JAN2018  1100 6000000 

推荐阅读