2

次の SAS コードは、「Radvalue」という数値変数を含むデータセットから読み取ることになっています。Radvalue はラジエーターの温度であり、ラジエーターのスイッチを切った後に温度が 2 以上上昇した場合はオンになったことを示し、オンになったが温度が 2 以上下がった場合はラジエーターが作動したことを示します。消えました。Radstate はデータセット内の新しい変数で、ラジエーターがオンかオフかを観測ごとに示します。これは、データセット全体に対して自動的に入力しようとしているものです。そのため、LAG 関数を使用して、dif_radvalue を持たない最初の行を初期化してから、説明したアルゴリズムを行 2 以降に適用しようとしています。Radstate 列と l_radstate 列が完全に空白になる理由は何ですか?

いつもありがとうございます!! 問題を明確に説明していない場合はお知らせください。

Data work.heating_algorithm_b;
 Input ID Radvalue; 
 Datalines; 
  1 15.38 
  2 15.38 
  3 20.79 
  4 33.47 
  5 37.03 
  6 40.45 
  7 40.45 
  8 40.96 
  9 39.44 
  10 31.41 
  11 26.49 
  12 23.06 
  13 21.75 
  14 20.16 
  15 19.23 
 ; 

DATA temp.heating_algorithm_c;
 SET temp.heating_algorithm_b;

 DIF_Radvalue = Radvalue - lag(Radvalue);

 l_Radstate = lag(Radstate);

 if missing(dif_radvalue) then  
  do;
   dif_radvalue = 0;
   radstate = "off"; 
  end;                            
 else if l_Radstate = "off"  &  DIF_Radvalue > 2    then Radstate = "on";
 else if l_Radstate = "on" &  DIF_Radvalue < -2  then  Radstate = "off";
 else  Radstate = l_Radstate;
run;
4

2 に答える 2

0

私は SAS の経験がありませんがmissing(l_Radstate)、最初からカバーするためにチェックが必要な場合があります。おそらく次のようなものです。

if missing(l_Radstate) then
do; radstate = "off"; end; 

強制的に行方不明にRadvalue - lag(Radvalue)ならなかった場合にのみ必要になると思います。DIF_Radvalueもしそうなら、何が役立つかわかりません...

于 2012-04-13T15:52:07.267 に答える
0

出力データ セット (RADSTATE) にのみ存在する変数に対して LAG 関数を実行しようとしました。RADSTATE の LAG を RETAIN に置き換えました。また、LAG関数を条件付きロジックの外に置いておくのは正しかった...以下のコードを試してください。

Data work.heating_algorithm_b;
 Input ID Radvalue; 
 Datalines; 
  1 15.38 
  2 15.38 
  3 20.79 
  4 33.47 
  5 37.03 
  6 40.45 
  7 40.45 
  8 40.96 
  9 39.44 
  10 31.41 
  11 26.49 
  12 23.06 
  13 21.75 
  14 20.16 
  15 19.23 
 ; 

DATA work.heating_algorithm_c;
 length radstate $3;
 retain radstate;
 SET work.heating_algorithm_b;

 old_radvalue=lag(radvalue);

 if _n_=1 then do;
  dif_radvalue=0;
  radstate="off";
 end;
 else do;
  DIF_Radvalue = Radvalue-Old_Radvalue;

  if Radstate = "off"  &  DIF_Radvalue > 2    then Radstate = "on";
  else if Radstate = "on" &  DIF_Radvalue < -2  then  Radstate = "off";
  /* Else Radstate stays the same */
 end;
run;
于 2012-04-13T17:02:18.523 に答える