2016-09-06 5 views
0

いくつかのレコードのバージョンが異なるログファイルがあります。合理的に大きなファイルのレコードによって、(ユーザー定義のリスト内の)各変数のNo of amendmentsを計算するSASの最も効果的な方法は何ですか?例えばSAS - 修正数を計算する

%let vars='Var1 Var2 Var4'; 

Record_ID Var1 Var2 VarThree Var4 
1 A A A A 
1 A A A B 
1 A A A A 
2 A A A A 
2 A B B A 
2 A B C B 
2 A B B A 

は、私は次のようになめらかに受信したい:次のソリューションは、あなたがしたいレイアウトを実現するために2つのステップを取る

ID Var No 
1 Var1 0 
1 Var2 0 
1 Var4 2 
2 Var1 0 
2 Var2 1 
2 Var4 2 

答えて

0

私は実行をカウントする最初の変数を使用しますが、LAGはVARSは乗り越えられないではないが、ラグの配列のための問題を提示する混合型だった場合、私が思うより簡単に思えます。私は、要件の開始となる変数のユーザ定義リストを扱うためのコードをいくつか追加しました。

data log; 
    input Record_ID (Var1-Var4)(:$1.); 
    cards; 
1 A A A A 
1 A A A B 
1 A A A A 
2 A A A A 
2 A B B A 
2 A B C B 
2 A B B A 
;;;; 
    run; 
proc print; 
    run; 
%macro main(data=log,id=record_id,vars=var1-var2 var4); 
    proc transpose data=&data(obs=0) out=vars; 
     var &vars; 
     run; 
    proc sql noprint; 
     select catx(' ',"set &data(keep=&id",_name_,"); by notsorted &id",_name_,';') 
     into :stmts separated by ' ' 
     from vars; 
     quit; 
    %put NOTE: &=sqlobs %bquote(&=stmts); 

    data report(keep=&id varname count); 
     do until(last.&id); 
     &stmts; 
     array _f[*] 'first.'n:; 
     array _n[%eval(&sqlobs+1)] n0-n&sqlobs; 
     drop n0; 
     do j = 2 to dim(_f); 
      _n[j] + _f[j]; 
      end; 
     end; 
     length varname $32;  
     do j=2 to dim(_f); 
     varname = scan(vname(_f[j]),-1); 
     count = _n[j]-1; 
     output; 
     end; 
     call missing(of _n[*]); 
     run; 
    proc print; 
     run; 
    %mend main; 
options mprint=1; 
%main(); 
+0

ありがとう、それはまさに私が必要としているものです!特にvarsパラメータ。 – user54060

0

、 1.変更のカウントを取得 2.転置。

data have; 
input (id var1-var4) ($); 
cards; 
1 A A A A 
1 A A A B 
1 A A A A 
2 A A A A 
2 A B B A 
2 A B C B 
2 A B B A 
; 


data _want; 
set have(rename=(var1-var4=v1-v4)); 
by id; 
array v v:; 
array var var1-var4; 
do over v; 
var+(v ne lag(v)); 
if first.id then var=0; 
end; 
if last.id; 
drop v1-v4; 
run; 

PROC TRANSPOSE DATA=_want 
    OUT=want(rename=col1=no) 
    NAME=var 
; 
    BY id; 
    VAR var1 var2 var3 var4; 
RUN; QUIT; 
+0

面白いことに、あなたは逆の順序で2つのステップを実行することになりました。まず最初にノーマライズしてから変更をカウントします。 – Quentin

0

データが大きすぎないと仮定すると、ここでは転置とカウントアプローチが最初に思い浮かびました。

data have; 
    input (id var1-var4) ($); 
    rowid=_n_; 
cards; 
1 A A A A 
1 A A A B 
1 A A A A 
2 A A A A 
2 A B B A 
2 A B C B 
2 A B B A 
; 

414 %let vars=Var1 Var2 Var4; 
415 
416 proc transpose data=have out=h(keep=id _name_ col1 
417        rename=(_name_=Var col1=Value) 
418        ); 
419 var &vars; 
420 by rowid id; 
421 run; 

NOTE: There were 7 observations read from the data set WORK.HAVE. 
NOTE: The data set WORK.H has 21 observations and 3 variables. 

422 
423 
424 proc sort data=h equals; 
425 by id Var; 
426 run; 

NOTE: There were 21 observations read from the data set WORK.H. 
NOTE: The data set WORK.H has 21 observations and 3 variables. 

427 
428 data want(keep=id Var NumberOfChanges); 
429 set h; 
430 by id Var Value notsorted; 
431 if first.Var then NumberOfChanges=0; 
432 else if first.Value then NumberOfChanges++1; 
433 if last.Var; 
434 
435 put (ID Var NumberofChanges)(=); 
436 run; 

id=1 Var=var1 NumberOfChanges=0 
id=1 Var=var2 NumberOfChanges=0 
id=1 Var=var4 NumberOfChanges=2 
id=2 Var=var1 NumberOfChanges=0 
id=2 Var=var2 NumberOfChanges=1 
id=2 Var=var4 NumberOfChanges=2 
NOTE: There were 21 observations read from the data set WORK.H. 
NOTE: The data set WORK.WANT has 6 observations and 3 variables. 
関連する問題