数据集HAVE
包含id
个值和一个字符变量names
。 names
中的值通常会丢失。如果names
除一个值之外的所有值都缺少id
,则可以删除names
中ID值缺失的ID的obs。如果某个值的所有names
都id
完全丢失(例如下面的id
= 2或5),则必须保留该id
值的一条记录。>
换句话说,我需要转向HAVE
:
id names
1
1
1 Matt, Lisa, Dan
1
2
2
2
3
3
3 Emily, Nate
3
4
4
4 Bob
5
进入WANT
:
id names
1 Matt, Lisa, Dan
2
3 Emily, Nate
4 Bob
5
我目前通过删除所有缺少names
的记录,然后将结果合并到一个包含所有原始值(1、2的变量KEY
)的新数据集id
上来进行此操作,3、4和5):
data WANT_pre;
set HAVE;
if names = " " then delete;
run;
data WANT;
merge KEY
WANT_pre;
by id;
run;
这是HAVE
的理想选择,因为我知道id
是一组从1到5的数值。但是我不太确定如何有效地做到这一点(A)较大的文件;如果无法简单地通过从1到n计数来创建id KEY
数据集,则为(B)。如果您的HAVE
有几百万个观测值,而您的id
值更复杂(例如,像XR4GN这样的十六进制值),您将如何产生WANT
?
答案 0 :(得分:2)
您可以在此处轻松使用SQL,MAX()适用于SQL中的字符变量。
proc sql;
create table want as
select id, max(names) as names
from have
group by ID;
quit;
另一种选择是改用UPDATE语句。
data want;
update have (obs=0) have;
by ID;
run;
答案 1 :(得分:1)
如果您的数据集按id
进行排序,则这似乎是DOW循环的不错选择:
data want;
do until(last.id);
set have;
by id;
length t_names $50; /*Set this to at least the same length as names unless you want the default length of 200 from coalescec*/
t_names = coalescec(t_names,names);
end;
names = t_names;
drop t_names;
run;
答案 2 :(得分:1)
proc summary data=have nway missing;
class id;
output out=want(drop=_:) idgroup(max(names) out(names)=);
run;
答案 3 :(得分:1)
使用UPDATE
语句。这将忽略缺失值并保留最后一个非缺失值。通常,它需要一个主数据集和一个事务数据集,但是您可以同时使用两者。
data want;
update have(obs=0) have ;
by id;
run;