我必须合并两个非常大的文件,我希望避免在数据步骤中这样做,因为这意味着对数据进行排序。我需要左文件中所有in的所有观察,不包括不在第二个文件中的in。
data leftdata;
input id $ y;
datalines;
AA 10
AA 20
BB 30
BB 40
CC 50
CC 80
DD 60
;run;
data rightdata;
input id $ ;
datalines;
AA
BB
;
run;
*Using datastep;
PROC SORT DATA=leftdata; BY id;
PROC SORT DATA=rightdata; BY id; RUN;
DATA datastep;
MERGE leftdata(IN=a) rightdata(IN=b);
BY id; IF a and b=0;
RUN;如何使用PROC实现相同的目标?
最后的产出必须包括以下意见:
CC 50
CC 80
DD 60发布于 2021-03-05 18:14:30
以下是两种方法:
WHERE NOT IN (SELECT ...)过滤,orLEFT JOIN,其中缺少正确的id.示例:
data have;
input id $ y;
datalines;
AA 10
AA 20
BB 30
BB 40
CC 50
CC 80
DD 60
;
data excluded_ids;
input id $ ;
datalines;
AA
BB
;
proc sql;
create table want as
select * from have
where id not in (select id from excluded_ids)
;
create table want as
select have.* from have
left join excluded_ids as remove
on have.id = remove.id
where remove.id is null
;对于第二种方式,如果排除列表具有重复的id,则需要一个SELECT DISTINCT。
数据步骤
使用哈希对象存储排除列表和check方法以测试是否删除
示例:
data want;
set have;
if _n_ = 1 then do;
declare hash exclude(dataset:'excluded_ids');
exclude.defineKey('id');
exclude.defineDone();
end;
if exclude.check() = 0 then delete;
run;https://stackoverflow.com/questions/66496825
复制相似问题