在 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;
这是我的数据集:
****************
* 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;