SAS如何验证一个值是否存在
SAS how to verifiy if a value exists
在 SAS 中,我想通过以下条件定义变量 new_var
:
对于每个id
,如果存在reference='A'
,则new_var='A'; else new_var='B'
,例如:
id reference new_var
-- --------- -------
1 A A
1 B A
1 C A
2 B B
2 B B
提前致谢!
您可以在 id 级别的基础上将引用为 A 的观察值加入原始数据集:
data have;
input id $ reference $;
datalines;
1 A
1 B
1 C
2 B
2 B
;
run;
proc sql;
create table want as select
a.id, a.reference,
case when b.reference = "A" then "A" else "B" end as new_var
from have as a
left join have (where = (reference = "A")) as b
on a.id = b.id
order by a.id, a.reference;
quit;
如果数据像您的示例一样简单并且按 id 和引用排序,那么只需检查 id 的每个更改的引用值(使用 first.id
)。 retain
语句为具有相同 ID 的每个后续行复制 new_var 值。
如果正在检查的参考值并不总是按字母顺序排在第一位,则此方法将不起作用。
data have;
input id reference $;
datalines;
1 A
1 B
1 C
2 B
2 B
;
run;
data want;
set have;
by id reference;
retain new_var;
if first.id then do;
if reference='A' then new_var='A';
else new_var='B';
end;
run;
在 SAS 中,我想通过以下条件定义变量 new_var
:
对于每个id
,如果存在reference='A'
,则new_var='A'; else new_var='B'
,例如:
id reference new_var
-- --------- -------
1 A A
1 B A
1 C A
2 B B
2 B B
提前致谢!
您可以在 id 级别的基础上将引用为 A 的观察值加入原始数据集:
data have;
input id $ reference $;
datalines;
1 A
1 B
1 C
2 B
2 B
;
run;
proc sql;
create table want as select
a.id, a.reference,
case when b.reference = "A" then "A" else "B" end as new_var
from have as a
left join have (where = (reference = "A")) as b
on a.id = b.id
order by a.id, a.reference;
quit;
如果数据像您的示例一样简单并且按 id 和引用排序,那么只需检查 id 的每个更改的引用值(使用 first.id
)。 retain
语句为具有相同 ID 的每个后续行复制 new_var 值。
如果正在检查的参考值并不总是按字母顺序排在第一位,则此方法将不起作用。
data have;
input id reference $;
datalines;
1 A
1 B
1 C
2 B
2 B
;
run;
data want;
set have;
by id reference;
retain new_var;
if first.id then do;
if reference='A' then new_var='A';
else new_var='B';
end;
run;