有条件地合并SAS中的两个数据表

ZeekDSA

我有一个表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;

我只是想找出执行以下操作的方法:

  1. 选择t1.PWSC = t2.CWC和t1.TPMC = t2.WC

  2. 从t1选择日期(t1.Date)= t2.Date

  3. 从t1(t1.time)中选择时间,从t2.Time中仅选择时间的第一个值(即,如果我们按升序对Time进行排序,则第一个将是00:00,前提是存在该时间,否则以第一个为准)

然后

  1. 合并两个数据集。

换句话说,我需要的是从t2检索数据仅在日期匹配,WC / TPMC和CWC / PWSC匹配时才t1合并并且,t2中的时间是asc中的第一个观测值。命令。

约翰尼斯·布莱赫(Johannes Bleher)

无法评论您的帖子以询问规格。据我了解您的问题:您想合并表“ 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

r-有条件地减去两个数据表

有条件地合并两个数据帧中的数据

如何有效地有条件地合并两个数据帧

有条件地对齐两个数据框,以派生作为传入numpy中的条件的列,其中

有条件地连接两个数据帧

有条件地更新数据表中数据的最快方法是什么?

有条件地减少Mongo Aggregation中的两个数组字段

有条件地合并对象中的两个列表

希望从两个表中有条件地获取数据

数据表中带有条件的子集

基于两个数据框中的列进行有条件的值替换

使用LINQ Entity Framework有条件地从两个列表中获取数据

在C#中合并两个数据表?

有条件地从表中获取数据

使用rbind和lapply在R中具有相同列的两个数据框之间有条件地复制行

如何从两个不同的表中按两个不同的类别有条件地排序

MongoDB-有条件地匹配两个数组

基于1个表中的2列有条件地联接到两个不同的表

在 R 中,根据左侧表中指示变量的值,有条件地左连接两个表

有条件地汇总-将两个查询合并为一个

如何有条件地合并两个相同形状的Numpy数组

有条件地将两个流与RxJ合并

使用字典理解有条件地合并两个字典

在 JQ 中有条件地合并两个单独的 JSON 对象

成语从数据表中有条件地选择列

修改行后,有条件地更新数据表视图中的字段吗?

有条件地将相同条件拆分为两个不同的表

有条件地合并两套

有条件地合并两行