2017-06-16 106 views
1

我有一个包含三个变量的数据集:应用程序编号,拒绝代码和序列。现在,单个应用程序可能会有多个拒绝代码(它们将具有不同的序列号)。因此,数据看起来像以下:将长转换为宽而不丢失SAS中的值

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中做到这一点?

回答

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; 

你也可以在一个datastep做到这一点平凡,使用firstlast检查。

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; 
相关问题