【问题标题】:sas adding column names and rows based on max and min valuessas 根据最大​​值和最小值添加列名和行
【发布时间】:2017-09-28 13:23:15
【问题描述】:

我希望数据被转置(日期)并相应地排列并填补空白 如:

/*COUNT ID BASED ON bucket and Sold_month*/
    PROC SQL;
CREATE TABLE want AS
SELECT bucket, Sold_month,COUNT(ID) as IID from TRANS_2 GROUP by bucket, 
Sold_month;
quit;

/*Format date*/
proc datasets ;
modify want;
FORMAT Sold_month YYMMN6.;
quit;

/*TRANSPOSE*/
PROC TRANSPOSE data=want out=wantf  (drop=_:)  prefix=D_ ;
by bucket;
var IID;
id Sold_month;
format IID best.;
run;

/*Sorting the dates Sold month*/
proc contents data=wantf out=col_names(keep=name) noprint;
run; 

proc sort data=col_names out=col_names_sorted;
 by name;
 run; 
 proc sql;
 create table col_names_sorted_n as
 select name from col_names_sorted where name<>'bucket';
 run;


 data _null_;
 set col_names_sorted_n;
 by name;
 retain sorted_cols;
 length sorted_cols $2500.;
 if _n_ = 1 then sorted_cols =name ;
 else sorted_cols = catx(' ', sorted_cols, name);
 call symput('sorted_cols', sorted_cols);
 run; 

  %put &sorted_cols;
  /* Final SOLD DATA- */
data output_sorted;
retain bucket &sorted_cols;
set wantf ;
run;

/*ADDING 0 to missing values*/
proc stdize data=output_sorted out=Transaction reponly missing=0;
run;

这可行,但我没有通过查看 bucket(0-max) 和 sold_dt(all year_month 从 min year-month 到 max year-month) 的最大值和最小值来获得我想要获得的缺失列名和行.我不想手动输入所有列/存储桶,而是导出最大值和最小值并执行。但是bucket应该从0开始到最大可用

【问题讨论】:

    标签: sas


    【解决方案1】:

    使用带有 COMPLETETYPES 选项的 PROC Summary 可能是最简单的。

    proc summary data=TRANS_2 nway completetypes ;
      class bucket sold_month ;
      var id;
      format sold_month yymmn6. ;
      output out=tall n=iid;
    run;
    
    proc transpose data=tall out=want(drop=_name_) prefix=d_ ;
      by bucket ;
      id sold_month;
      var iid ;
    run;
    

    如果您完全缺少 BUCKET 值,例如您根本没有 BUCKET=4 的记录,那么您将需要添加一些记录。可能更容易将它们添加到汇总表中,在这种情况下,您可以跳过 COMPLETETYPES 并自行完成。所以总结一下数据:

    proc sql noprint;
      create table tall as
        select bucket
             , intnx('month',sold_month,0,'b') as sold_month format=yymmn6.
             , count(id) as IID
        from TRANS_2
        group by 1,2
      ;
      create table tall_dummy as 
        select max(bucket) as bucket
             , min(sold_month) as min   
             , max(sold_month) as max
        from tall
      ;
    quit;
    

    生成所有存储桶编号和所有月份的表,计数为零。

    data tall_dummy ;
      set tall_dummy ;
      keep bucket sold_month iid;
      iid=0;
      do bucket = 0 to bucket ;
        do i=0 to intck('month',min,max);
          sold_month=intnx('month',min,i,'b') ;
          output;
        end;
      end;
      format sold_month yymmn6.;
    run;
    

    然后与实际的 bucket*month 组合合并,并用实际计数替换零。

    data tall_full ;
      merge tall_dummy tall ;
      by bucket sold_month;
    run; 
    

    然后你就可以转置了。

    proc transpose data=tall_full out=want(drop=_name_) prefix=d_ ;
      by bucket ;
      id sold_month;
      var iid ;
    run;
    

    【讨论】:

    • 我可以使用代码的第二部分得到存储桶,但没有得到所有丢失的 sold_months
    • 更新为使用单个数据步骤来创建 0 到 max(bucket) 和 min(date) 到 max(date) 虚拟数据集。请注意,跨年应该不是问题。如果您想将最小日期四舍五入到一月,那么您可以使用带有“年”间隔的 intnx()。
    猜你喜欢
    • 1970-01-01
    • 2021-03-08
    • 2020-05-28
    • 2021-02-21
    • 2011-07-13
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    相关资源
    最近更新 更多