将长整数转换为宽而不会丢失SAS中的值

时间:2017-06-16 15:18:38

标签: sas sas-macro

我有一个包含三个变量的数据集:应用程序编号,拒绝代码和序列。现在,单个应用程序可能有多个拒绝代码(具有不同的序列号)。所以数据如下:

Application No       Decline Code      Sequence 

1234                      FG              1
1234                      FK              3
1234                      AF              2
1256                      AF              2
1256                      FK              1
. 
. 
. 
. 

等等

所以,我必须把它放在宽格式中,这样第一列包含唯一的应用程序编号,并且每个对应的代码都是它们的拒绝代码(我不需要序列号,只是拒绝代码应该按顺序出现它们的序列号从左到右,用逗号分隔)。像下面的东西

Application Number            Decline Code
1234                           FG, AF, FK
1256                           FK, AF
.......... 
......... 

等等

现在我尝试通过SAS上的应用程序编号破坏proc转置。但问题是它会创建多列,列出所有拒绝代码,然后如果某个拒绝代码不适用于某个应用程序,它将显示。在那里面。所以他们有许多缺失值,并不是我期望的格式。有没有办法在SAS或sql中执行此操作?

1 个答案:

答案 0 :(得分:2)

PROC TRANSPOSE当然可以提供帮助;如果你真的只想要一个变量,那么你可以将变量一起CATX:

data have;
input ApplicationNo       DeclineCode  $    Sequence ;
datalines;
1234                      FG              1
1234                      FK              3
1234                      AF              2
1256                      AF              2
1256                      FK              1
;;;;
run;
proc sort data=have;
  by ApplicationNo Sequence;
run;
proc transpose data=have out=want_pre;
  by ApplicationNo;
  var DeclineCode;
run;

data want;
  set want_pre;
  length decline_codes $1024;
  decline_codes = catx(', ',of col:);
  keep ApplicationNo decline_codes;
run;

您还可以使用firstlast检查在一个datastep中轻松完成此操作。

data want_ds;
  set have;
  by ApplicationNo Sequence;
  retain decline_codes;
  length decline_codes $1024; *or whatever you need;
  if first.ApplicationNo then call missing(decline_codes);
  decline_codes = catx(',',decline_codes, DeclineCode);
  if last.ApplicationNo then output;
run;