在SAS中保留声明

时间:2016-01-13 21:34:21

标签: sas retain

这是我作为数据集的内容:

****************
* 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 功能。但是我无法使它发挥作用。

请帮忙。

4 个答案:

答案 0 :(得分:1)

你可能会考虑UPDATE技巧。它具有您所寻求的品质,并且它将LOCF所有变量。

data value;
   input (name value value2)(:$1.);
   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;

enter image description here

答案 1 :(得分:0)

按名称订购您的数据集。

然后:

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设置为缺失,所以在set语句的下一个输入中我们可以得到该数字,如果有的话。

答案 2 :(得分:0)

你非常接近。相反,在名为retain的新变量上使用_value语句,并在每个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;

答案 3 :(得分:0)

或者,您可以在数据步骤的开头设置它,以避免需要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;