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

Sas 折叠大型数据集,同时有条件地保留一些缺少的值,sas,data-cleaning,Sas,Data Cleaning,数据集HAVE包括id值和名称的字符变量。名称中的值通常缺失。如果names缺少id中除一个以外的所有值,则可以删除names中缺少值的id的obs。如果某个值的所有id的names完全丢失(如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 进入想要的: id names 1 Matt, Lisa, Da

数据集
HAVE
包括
id
值和
名称的字符变量。
名称中的值通常缺失。如果
names
缺少
id
中除一个以外的所有值,则可以删除
names
中缺少值的id的obs。如果某个值的所有
id
names
完全丢失(如
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
进入
想要的

id  names
1   Matt, Lisa, Dan
2
3   Emily, Nate
4   Bob
5
目前,我通过删除
names
缺失的所有记录,然后将结果合并到一个新的数据集
KEY
,其中包含一个变量
id
,该变量包含所有原始值(1、2、3、4和5):


这非常适合于HAVE
,因为我知道
id
是一组介于1到5之间的数值。但我不太确定我如何能有效地做到这一点(A)在一个更大的文件上,以及(B)如果我不能简单地通过从1到n的计数创建一个id
KEY
数据集。如果您的
数百万次观察,并且您的
id
值更复杂(例如,十六进制值,如XR4GN),您将如何生成
想要的

假设您的数据集按
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;

假设您的数据集是按
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;

您可以在这里轻松地使用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;

您可以在这里轻松地使用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;

使用
UPDATE
语句。这将忽略缺少的值并保留最后一个非缺少的值。它通常需要一个主数据集和一个事务数据集,但您可以同时使用单个数据集

data want;
  update have(obs=0) have ;
  by id;
run;

使用
UPDATE
语句。这将忽略缺少的值并保留最后一个非缺少的值。它通常需要一个主数据集和一个事务数据集,但您可以同时使用单个数据集

data want;
  update have(obs=0) have ;
  by id;
run;

您是否曾经使用相同的
id在不同的行中为
名称
设置过不同的值?如果是这样,您会保留哪些
名称
?您是否曾经在具有相同
id的不同行中为
名称
设置过不同的值?如果是,您会保留哪些
名称