SAS - 在数据集中的特定日期之前5天和之后5天添加日期。如何在其他列中重复值?

时间:2016-11-14 13:38:07

标签: sas

让我们将数据集视为下表中给出的内容:

TPMC    PWC PWSC    Site    ET  Date    Time    DIAM    PXMC    SF
7101    7101    US000521    1   Works1  08Nov2016   11:58   890,3       1
7102    7102    US000361    1   Works1  02Nov2016   13:01   878,1       1
7102    7102    UC000348    2   Works1  07Nov2016   18:22   877,3       1
7106    7106    UC00424 1   Works1  05Oct2016   9:43    890,4       1
7106    7106    UC00437 3   Works1  07Nov2016   18:23   877,1       1
7106    7106    UC309   4   Works1  07Nov2016   18:26   877,8       1
7107    7107    UC05327 1   Works1  06Oct2016   8:41    837     1
7107    7107    UC200   2   Works1  13Oct2016   12:53   890,55      1
7108    7108    UC000361    3   Works1  02Nov2016   13:01   878,1       1
7108    7108    UC00432 1   Works1  07Nov2016   18:25   877,8       1
7108    7108    UC106   2   Works1  03Oct2016   9:37    890,3       1

请使用以下代码获取上述数据表:

data have;
  input TPMC $ PWC $ PWSC $ Site ET $ Date :date8. Time :TIME. DIAM PXMC $ SF;
  FORMAT DATE date8. Time HHMM.;
datalines;
7101 7101 US000521 1 Works1 08Nov2016 11:58 890.3 1
7102 7102 US000361 1 Works1 02Nov2016 13:01 878.1 1
7102 7102 UC000348 2 Works1 07Nov2016 18:22 877.3 1
7106 7106 UC00424 1 Works1 05Oct2016 9:43 890.4 1
7106 7106 UC00437 3 Works1 07Nov2016 18:23 877.1 1
7106 7106 UC309 4 Works1 07Nov2016 18:26 877.8 1
7107 7107 UC05327 1 Works1 06Oct2016 8:41 837  1
7107 7107 UC200 2 Works1 13Oct2016 12:53 890.55 1
7108 7108 UC000361 3 Works1 02Nov2016 13:01 878.1 1
7108 7108 UC00432 1 Works1 07Nov2016 18:25 877.8 1
7108 7108 UC106 2 Works1 03Oct2016 9:37 890.3 1
;
run;

现在,当我使用以下SAS代码时:

data DaysBeforeAfterEvent;
 set XX;
 array x{1} _temporary_;
 x{1}=Date;
 call missing(of _all_);
 do i=5 to 1 by -1;
   Date=x{1}-i;output;
 end;
 set XX point=_n_; output;
 call missing(of _all_);
 do i=1 to 5;
   date=x{1}+i;output;
 end;
 drop i;
 run;

我会得到一个类似于下面给出的结果表:

TPMC    PWC PWSC    Site    ET  Date    Time    DIAM    PXMC    SF
                    03Nov2016               
                    04Nov2016               
                    05Nov2016               
                    06Nov2016               
                    07Nov2016               
7101    7101    US000521    1   Works1  08Nov2016   11:58   890,3       1
                    09Nov2016               
                    10Nov2016               
                    11Nov2016               
                    12Nov2016               
                    13Nov2016               
                    28Oct2016               
                    29Oct2016               
                    30Oct2016               
                    31Oct2016               
                    01Nov2016               
7102    7102    US000361    1   Works1  02Nov2016   13:01   878,1       1
                    03Nov2016               
                    04Nov2016               
                    05Nov2016               
                    06Nov2016               
                    07Nov2016               
7102    7102    UC000348    2   Works1  07Nov2016   18:22   877,3       1
 .
 .
 .

但不幸的是,我没有得到我想要的东西。我需要最终结果看起来像下表中给出的结果:

TPMC    PWC PWSC    Site    ET  Date    Time    DIAM    PXMC    SF
7101                    03Nov2016   0:00            
7101                    04Nov2016   0:00            
7101                    05Nov2016   0:00            
7101                    06Nov2016   0:00            
7101                    07Nov2016   0:00            
7101    7101    US000521    1   Works1  08Nov2016   11:58   890,3       1
7101                    09Nov2016   0:00            
7101                    10Nov2016   0:00            
7101                    11Nov2016   0:00            
7101                    12Nov2016   0:00            
7101                    13Nov2016   0:00            
7102                    28Oct2016   0:00            
7102                    29Oct2016   0:00            
7102                    30Oct2016   0:00            
7102                    31Oct2016   0:00            
7102                    01Nov2016   0:00            
7102    7102    US000361    1   Works1  02Nov2016   13:01   878,1       1
7102                    03Nov2016   0:00            
7102                    04Nov2016   0:00            
7102                    05Nov2016   0:00            
7102                    06Nov2016   0:00            
7102                    07Nov2016   0:00            
7102    7102    UC000348    2   Works1  07Nov2016   18:22   877,3       1
.
.
.
.

2 个答案:

答案 0 :(得分:1)

你需要:

  • 从您的输入样本数据中删除SF,因为它没有任何关联数据
  • 将时间设置为零(不缺少)
  • 仅设置缺少您想要丢失的变量。

如下:

data DaysBeforeAfterEvent;
 set have;
 array x{1} _temporary_;
 x{1}=Date;
 call missing(pwc, pwsc, site, diam, pxmc, sf, et);
 time=0;
 do i=5 to 1 by -1;
   Date=x{1}-i;output;
 end;
 set have point=_n_; output;
 call missing(pwc, pwsc, site, diam, pxmc, sf, et);
 time=0;
 do i=1 to 5;
   date=x{1}+i;output;
 end;
 drop i;
run;

enter image description here

答案 1 :(得分:0)

最后这是有效的答案:

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;