SAS 修改 and/or 用更新的数据替换主数据
SAS Modify and/or Replace Master Data with Updated Data
我有两个数据集 -- 一个主数据集,需要用另一个数据集中包含的最新数据定期更新。我一直在玩弄 MODIFY
语句,但我无法完全替换数据组。下面的代码创建了两个示例数据集:
data new;
input year dqtr age yearq;
datalines;
2011 4 43 20114
2011 4 25 20114
2013 1 52 20131
2013 1 45 20131
2013 2 72 20132
2013 2 43 20132
2013 3 93 20133
2013 3 97 20133
2013 4 23 20134
2013 4 37 20134
;
run;
data master;
input year dqtr age yearq;
datalines;
2011 3 94 20113
2011 3 76 20113
2011 3 56 20113
2011 4 43 20114
2011 4 62 20114
2011 4 73 20114
;
run;
变量 YEARQ 是 YEAR 和 DQTR 的串联变量。如果 YEARQ 组合不在主数据集中,则应将其附加。如果它在主数据集中,那么它应该替换整个组。例如,只有 YEARQ=20114 应该在最终数据集中。原来的 3 个 20114 obs 应该换成 2 个新的 20114 obs。下面的代码几乎可以满足我的要求,但是 YEARQ 的整个组都没有被替换(它只替换了第一个,但是发现了该组合的许多观察结果):
data master(index=(yearq));
set master;
run;
data master;
set new;
modify master key=yearq;
if _iorc_ =0 then replace;
else do;
_error_=0;
_iorc_=0;
output;
end;
run;
正如我看到的您的 update
过程,基本上您正在尝试做的是遵循
- 如果您的
new
数据集包含一个现有的 yearq
值,那么您将在 master
数据集中更新它,即从 [=16] 中删除所有常见的 yearq
=] 并将新的 yearq
从 new
附加到 master
- 您还将任何新的
yearq
附加到 master
数据集。
提取常用yearq
proc sql;
create table common as select distinct(a.yearq) from master as a, new as b
where a.yearq=b.yearq;
quit;
正在从 master
中删除公共 yearq
proc sql;
create table temp as select * from master where yearq not in(select yearq from common);
quit;
将 new
数据集附加到 master
数据集
data master;
set temp
new;
run;
我有两个数据集 -- 一个主数据集,需要用另一个数据集中包含的最新数据定期更新。我一直在玩弄 MODIFY
语句,但我无法完全替换数据组。下面的代码创建了两个示例数据集:
data new;
input year dqtr age yearq;
datalines;
2011 4 43 20114
2011 4 25 20114
2013 1 52 20131
2013 1 45 20131
2013 2 72 20132
2013 2 43 20132
2013 3 93 20133
2013 3 97 20133
2013 4 23 20134
2013 4 37 20134
;
run;
data master;
input year dqtr age yearq;
datalines;
2011 3 94 20113
2011 3 76 20113
2011 3 56 20113
2011 4 43 20114
2011 4 62 20114
2011 4 73 20114
;
run;
变量 YEARQ 是 YEAR 和 DQTR 的串联变量。如果 YEARQ 组合不在主数据集中,则应将其附加。如果它在主数据集中,那么它应该替换整个组。例如,只有 YEARQ=20114 应该在最终数据集中。原来的 3 个 20114 obs 应该换成 2 个新的 20114 obs。下面的代码几乎可以满足我的要求,但是 YEARQ 的整个组都没有被替换(它只替换了第一个,但是发现了该组合的许多观察结果):
data master(index=(yearq));
set master;
run;
data master;
set new;
modify master key=yearq;
if _iorc_ =0 then replace;
else do;
_error_=0;
_iorc_=0;
output;
end;
run;
正如我看到的您的 update
过程,基本上您正在尝试做的是遵循
- 如果您的
new
数据集包含一个现有的yearq
值,那么您将在master
数据集中更新它,即从 [=16] 中删除所有常见的yearq
=] 并将新的yearq
从new
附加到master
- 您还将任何新的
yearq
附加到master
数据集。
提取常用yearq
proc sql;
create table common as select distinct(a.yearq) from master as a, new as b
where a.yearq=b.yearq;
quit;
正在从 master
中删除公共yearq
proc sql;
create table temp as select * from master where yearq not in(select yearq from common);
quit;
将 new
数据集附加到 master
数据集
data master;
set temp
new;
run;