下面的SAS代码位应该是从包含一个名为“Radvalue”的数值变量的数据集中读取的Radvalue是一个散热器的温度,如果一个散热器关闭,但它的温度增加了2或更多,这是它已经打开的迹象,如果它打开,但它的温度下降了2或更多,这是它已经关闭的迹象。
radstate是数据集中的一个新变量,它指示每个观察值散热器是打开还是关闭,我正试图为整个数据集自动填充这个变量。
所以我尝试使用LAG函数,尝试初始化第一行,它没有difúradvalue,然后尝试将我刚才描述的算法应用到第2行
知道为什么radstate和l_u 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;

最佳答案

您试图对仅存在于输出数据集(RADATATE)中的变量执行滞后函数。我用留守代替了拉德斯塔德的落后。另外,您将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;

10-06 01:40