如何将一个观察与同一列中的另一个观察与sas匹配

时间:2013-03-28 05:41:30

标签: sas

我的数据看起来像这样,

S. No   AB001A  AB0002A AB362   VAR1    VAR2    VAR3    SUM %Match  Rank
    1   -/-        C/C   A/A                        
    2   C/C        C/C   A/A                        
    3   C/C        C/C   A/A                        
    4   C/C        C/C   A/A                        
    5   C/C        C/C   A/A                        
    6   C/C        C/C   A/A                        
    7   C/C        C/C   A/A                        
    8   -/-        -/-   -/-                        
    9   C/C        C/C   A/A                        
    10  C/C        C/C   A/A                        
    11  -/-        C/C   A/A                        
    12  C/C        C/C   A/A                        
    13  C/C        C/C   A/A                        
    14  C/C        C/C   A/A                        
    16  C/C        -/-   A/A                        
    17  -/-        C/C   A/A                        
    18  C/C        C/C   A/A                        
    19  C/C        C/C   A/A                        

我想将obs 3与obs 2匹配,如果它完全匹配则得分将为1,否则将存储在var1中为AB001a,在var2中为ab0002a,在var3中为ab362,我想计算所有的总和1和观察匹配百分比及其排名(前十名匹配者), 我在excel中成功完成了这项工作,但是我花了很多时间,如果条件在excel中使用(= if(A3 = A $ 2,1,0)然后我在所有的blind中拖动,我做了所有obs的总和,他们的%匹配和排名。 我的问题是如何在sas中做到这一点?我可以使用数组吗?或者循环和数组的组合?我的数据是如此之大,有5,15,567个障碍物。 任何人都可以指导我如何在sas中执行此操作,因为我希望减少分析数据的时间。 感谢您 的问候,

1 个答案:

答案 0 :(得分:0)

如果您只是总结了3个变量,则不需要使用循环或数组,但如果有更多变量,我会使用数组。我正在使用LAG功能来执行此任务,它需要一定程度的小心,以确保它按您想要的方式工作。确保你不使用IF ... THEN ... ELSE语句。我已计算除Rank之外的所有汇总统计数据,因为我不确定您排名的变量。如果您在在线文档中查看PROC RANK,那么您应该能够找出要做的事情。 希望这会有所帮助。

data have;
input S_No AB001A $  AB0002A $ AB362 $;
datalines;
    1   -/-        C/C   A/A                        
    2   C/C        C/C   A/A                        
    3   C/C        C/C   A/A                        
    4   C/C        C/C   A/A                        
    5   C/C        C/C   A/A                        
    6   C/C        C/C   A/A                        
    7   C/C        C/C   A/A                        
    8   -/-        -/-   -/-                        
    9   C/C        C/C   A/A                        
    10  C/C        C/C   A/A                        
    11  -/-        C/C   A/A                        
    12  C/C        C/C   A/A                        
    13  C/C        C/C   A/A                        
    14  C/C        C/C   A/A                        
    16  C/C        -/-   A/A                        
    17  -/-        C/C   A/A                        
    18  C/C        C/C   A/A                        
    19  C/C        C/C   A/A
;
run;

/* count number of variables starting with AB */
proc sql noprint;
select (count(*) into :num_ab
from dictionary.columns
where libname='WORK' and upper(memname)='HAVE' and name eqt 'AB';
quit;

%put numvars = &num_ab.;

data want;
set have;
array mole{&num_ab.} AB: ;
array newvar{&num_ab.} var1 - var%left(&num_ab.);
do i=1 to dim(mole);
    newvar{i} = (mole{i}=lag(mole{i}));
end;
sumvar=sum(of var1-var%left(&num_ab.));
match_pc=sumvar/&num_ab.;
drop i;
run;