在 SAS 中保留语句

Retain statement in SAS

这是我的数据集:

****************
* name * value *
*  x   *   #   *
*  x   *   .   *
*  x   *   .   *
*  x   *   .   *
*  y   *   .   *
*  y   *   #   *
*  y   *   .   *
*  y   *   .   *
*  z   *   .   *
*  z   *   .   *
*  z   *   #   *
*  z   *   .   *
*  z   *   .   *
*  z   *   #   *
****************

我想要做的是让数字 (#) 保留到每个名称的字符串末尾。结果如下:

****************
* name * value *
*  x   *   #   *
*  x   *   #   *
*  x   *   #   *
*  x   *   #   *
*  y   *   .   *
*  y   *   #   *
*  y   *   #   *
*  y   *   #   *
*  z   *   .   *
*  z   *   .   *
*  z   *   #   *
*  z   *   #   *
*  z   *   #   *
*  z   *   #   *
****************

。留下来是因为没有该点的数据。我只需要完成我有数据的字符串。

到目前为止,我的代码如下所示:

DATA test;
  SET test;
  retain _variable;
  if not missing(variable) then _variable=variable;
  else variable=_variable;
  drop _variable;
RUN;

它不起作用,因为 x 的最后一个 # 值会转移到 y 的第一个值。 我想到了使用 直到 last.variable 功能。但是我无法让它工作。

请帮忙。

按名称排序您的数据集。

然后:

data want;
set have;
by name;
retain new_value;

if value ne . then new_value = value;
output;
if last.name then new_value = .;
run;

输出后,我们检查它是否是姓氏,如果是,我们将 new_value 设置为 missing,因此在 set 语句的下一个输入中我们可以获得数字,如果有的话.

你们非常亲密。相反,在名为 _value 的新变量上使用 retain 语句,并在每个 name 组的开头重置它。最后,删除原来的 value,然后使用数据步骤选项将 _value 重命名回 value

DATA want(rename=(_value = value) );
  SET have;
  by name;

  retain _value;

  if(NOT missing(value) ) then _value = value;

  output;

  if(last.name) then call missing(_value);

  drop value;
RUN;

或者,您可以在数据步骤开始时将其设置为缺失,以避免需要 OUTPUT 语句:

data want(drop = temp);
set have;
by name;
retain temp;

if first.name then temp = .; /* reset */

if value ne . then temp = value;
else if value eq . then value = temp;

run;

您可以考虑更新技巧。它具有您寻求的品质,而且它将 LOCF 所有变量。

data value;
   input (name value value2)(:.);
   cards;
 x      #     $
 x      .     @ 
 x      .     . 
 x      .     . 
 y      .     $
 y      #     .
 y      .     @
 y      .     .
 z      .     .
 z      .     .
 z      #     $
 z      .     .
 z      .     .
 z      #     @
 ;;;;
   run;
proc print;
   run;
data locf;
   update value(obs=0) value;
   by name;
   output;
   run; 
proc print;
   run;