簡體   English   中英

SAS-計算修訂數量

[英]SAS - calculate the number of amendments

我有一個日志文件,其中包含一些記錄的不同版本。 在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  

我想收到像這樣的東西:

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

以下解決方案分兩步實現所需的布局: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;

我使用第一個變量來計算運行次數,但是我想,如果VARS是混合類型的,那么LAG似乎更容易,盡管這不是無法克服的,但會帶來一系列滯后問題。 我添加了一些代碼來處理用戶定義的變量列表,這將是要求的起點。

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();

假設數據不是太大,這是我首先想到的轉置然后計數方法。

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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM