我有一个表1,该表具有以下数据,如以下代码所示:
data have(index=(date));
infile cards truncover expandtabs;
input TPMC PWC PWSC $ Site ET $ Date : date9. Time $ DIAM $ PXMC $ SF;
format date date9.;
cards;
7101 7101 US000521 1 Works1 08Nov2016 11:58 890,3 1
7102 7102 US000361 1 Works2 02Nov2016 13:01 878,1 1
7102 7102 UC000348 2 Works3 07Nov2016 18:22 877,3 1
7106 7106 UC00424 1 Works1 05Oct2016 9:43 890,4 1
7106 7106 UC00437 3 Works2 07Nov2016 18:23 877,1 1
7106 7106 UC309 4 Works3 07Nov2016 18:26 877,8 1
7107 7107 UC05327 1 Works1 06Oct2016 8:41 837 1
7107 7107 UC200 2 Works2 13Oct2016 12:53 890,55 1
7108 7108 UC000361 3 Works1 02Nov2016 13:01 878,1 1
7108 7108 UC00432 1 Works2 07Nov2016 18:25 877,8 1
7108 7108 UC106 2 Works3 03Oct2016 9:37 890,3 1
;
run;
data want;
set have;
array x{1} _temporary_;
array y{1} $ 40 _temporary_;
x{1}=date;y{1}=TPMC;
call missing(of _all_);
TPMC=y{1};Time=0;
do i=5 to 1 by -1;
date=x{1}-i;output;
end;
set have point=_n_;output;
call missing(of _all_);
TPMC=y{1};Time=0;
do i=1 to 5;
date=x{1}+i;output;
end;
drop i;
run;
我还有另一张桌子,如下所示:
data have0001;
input WPmeas $ Date :date8. Time :Time. T_Id $ ASN $ WC $ CWC T_Side M_No $ Yval $ XVal $;
FORMAT DATE date8. Time HHMM.;
datalines;
1 19JAN16 12:19 20949 1 7604 US2301 R 1 -82140 2468
2 21JAN16 11:11 20949 1 7604 US2302 R 2 -81940 2466
3 01FEB16 16:13 20949 1 7604 US2303 R 3 -81739 2463
4 29MAR16 13:12 20949 1 7604 US2303 R 4 -81539 2459
5 13MAY16 14:11 20949 1 7604 US2304 R 5 -81339 2456
6 05OCT16 15:15 20949 1 7106 US2301 R 6 -82140 2468
7 07NOV16 16:18 20949 1 7106 US2302 R 7 -81940 2466
8 01FEB16 17:15 20949 1 7604 US2303 R 8 -81739 2463
9 29MAR16 18:17 20949 1 7604 US2303 R 9 -81539 2459
10 13MAY16 19:12 20949 1 7604 US2304 R 10 -81339 2456
;
run;
我只是想找出执行以下操作的方法:
选择t1.PWSC = t2.CWC和t1.TPMC = t2.WC
从t1选择日期(t1.Date)= t2.Date
从t1(t1.time)中选择时间,从t2.Time中仅选择时间的第一个值(即,如果我们按升序对Time进行排序,则第一个将是00:00,前提是存在该时间,否则以第一个为准)
然后
换句话说,我需要的是从t2检索数据并仅在日期匹配,WC / TPMC和CWC / PWSC匹配时才与t1合并。并且,t2中的时间是asc中的第一个观测值。命令。
无法评论您的帖子以询问规格。据我了解您的问题:您想合并表“ want”(= t2)和“ have0001”(= t1)。关于关键变量pwc cwc和日期的重复出现在“ have0001”(= t1)中。
我假设“ have0001”(= t1)是小的表,并对其进行排序,而不会引起太多问题。然后,以下代码使用哈希对象合并两个表。
它生成一个表merge1,该表以最小的时间值获取t1中的第一个重复项。如果您希望重复项与t2中的相同值合并几次并输出,那么在代码末尾还会有一个示例,为您提供数据集merge2。
data have(index=(date));
infile cards truncover expandtabs;
input TPMC PWC PWSC $ Site ET $ Date : date9. Time :Time. DIAM $ PXMC $ SF;
format date date9.;
cards;
7101 7101 US2301 1 Works1 19JAN16 11:58 890,3 1
7102 7102 US2301 1 Works2 02Nov2016 13:01 878,1 1
7102 7102 UC000348 2 Works3 07Nov2016 18:22 877,3 1
7106 7106 UC00424 1 Works1 05Oct2016 9:43 890,4 1
7106 7106 UC00437 3 Works2 07Nov2016 18:23 877,1 1
7106 7106 UC309 4 Works3 07Nov2016 18:26 877,8 1
7107 7107 UC05327 1 Works1 06Oct2016 8:41 837 1
7107 7107 UC200 2 Works2 13Oct2016 12:53 890,55 1
7108 7108 UC000361 3 Works1 02Nov2016 13:01 878,1 1
7108 7108 UC00432 1 Works2 07Nov2016 18:25 877,8 1
7108 7108 UC106 2 Works3 03Oct2016 9:37 890,3 1
;
run;
data have0001;
input WPmeas $ Date :date8. Time :Time. T_Id $ ASN $ WC CWC $ T_Side M_No $ Yval $ XVal $;
FORMAT DATE date8. Time HHMM.;
datalines;
2 19JAN16 12:00 20949 1 7101 US2301 R 2 -81940 2466
1 19JAN16 11:58 20949 1 7101 US2301 R 1 -82140 2468
3 01FEB16 16:13 20949 1 7604 US2303 R 3 -81739 2463
4 29MAR16 13:12 20949 1 7604 US2303 R 4 -81539 2459
5 13MAY16 14:11 20949 1 7604 US2304 R 5 -81339 2456
6 05OCT16 15:15 20949 1 7106 US2301 R 6 -82140 2468
7 07NOV16 16:18 20949 1 7106 US2302 R 7 -81940 2466
8 01FEB16 17:15 20949 1 7604 US2303 R 8 -81739 2463
9 29MAR16 18:17 20949 1 7604 US2303 R 9 -81539 2459
10 13MAY16 19:12 20949 1 7604 US2304 R 10 -81339 2456
;
run;
data want;
set have;
array x{1} _temporary_;
array y{1} $ 40 _temporary_;
x{1}=date;y{1}=TPMC;
call missing(of _all_);
TPMC=y{1};Time=0;
do i=5 to 1 by -1;
date=x{1}-i;output;
end;
set have point=_n_;output;
call missing(of _all_);
TPMC=y{1};Time=0;
do i=1 to 5;
date=x{1}+i;output;
end;
drop i;
run;
proc sort data=have0001;
by WC CWC date time
run;
data merged1;
if 0 then set have0001;
if _N_ = 1 then do;
declare hash hh(dataset:'have0001',ordered:'Y',multidata:'Y');
hh.definekey('WC','CWC','date');
hh.definedata(all:'Y');
hh.definedone();
end;
do until (theend);
set want (rename=(PWSC=CWC TPMC=WC)) end=theend;
rc = hh.find();
if rc=0 then output;
end;
run;
data merged2;
if 0 then set have0001;
if _N_ = 1 then do;
declare hash hh(dataset:'have0001',ordered:'Y',multidata:'Y');
hh.definekey('WC','CWC','date');
hh.definedata(all:'Y');
hh.definedone();
end;
do until (theend);
set want (rename=(PWSC=CWC TPMC=WC)) end=theend;
rc = hh.find();
do while (rc = 0);
output;
rc = hh.find_next();
end;
end;
run;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句