这是我作为数据集的内容:
****************
* 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 功能。但是我无法使它发挥作用。
请帮忙。
答案 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;
答案 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;