0

我的数据看起来像这样,

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

4

1 回答 1

0

如果您只汇总 3 个变量,则不需要使用循环或数组,但如果有更多变量,我会使用数组。我正在使用 LAG 功能来执行此任务,它确实需要一定的小心才能确保它按您的意愿工作。确保不使用 IF...THEN...ELSE 语句。我已经计算了除排名之外的所有汇总统计数据,因为我不确定您要对哪个变量进行排名。如果您在在线文档中查看 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;
于 2013-03-28T09:25:13.997 回答