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的计数创建一个idKEY
数据集。如果您的有
数百万次观察,并且您的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的不同行中为名称
设置过不同的值?如果是,您会保留哪些名称
?