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 になります。これは、AB001a の場合は var1 に、ab0002a の場合は var2 に、ab362 の場合は var3 に格納され、すべての 1 の合計を計算したいと思います。観測一致率とそのランク (トップ 10 のマッチャー)、私はこれを 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 に答える