折叠大型数据集,同时有条件地保留一些缺失值

时间:2019-02-13 17:39:41

标签: sas data-cleaning

数据集HAVE包含id个值和一个字符变量namesnames中的值通常会丢失。如果names除一个值之外的所有值都缺少id,则可以删除names中ID值缺失的ID的obs。如果某个值的所有namesid完全丢失(例如下面的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

4 个答案:

答案 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;