Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 行差_Date_Sas_Rows - Fatal编程技术网

Date 行差

Date 行差,date,sas,rows,Date,Sas,Rows,我必须计算时间=0的第一个日期和之后的日期之间的日期差。我还有一个变量=因子,它有两类:一类;两个 例如,这里有一个日期: A B TIME 10/11/2016 one T0 17/11/2016 two T0 05/01/2017 one T1 28/02/2017 two T1 06/07/2017 one T2 05/09/2017 two T2 我想计算

我必须计算时间=0的第一个日期和之后的日期之间的日期差。我还有一个变量=因子,它有两类:一类;两个

例如,这里有一个日期:

A             B       TIME
10/11/2016    one      T0
17/11/2016    two      T0
05/01/2017    one      T1
28/02/2017    two      T1
06/07/2017    one      T2
05/09/2017    two      T2
我想计算T0与B=“1”和B=“2”日期之间的差值,以获得:

DIFF
0
0
56 
103
238
292
计算差异如下:

56 = T1-T0 for "one" = 05/01/2017 - 10/11/2016  
103 = T1-T0 for "two" = 28/02/2017 - 17/11/2016   
238 = T2-T0 for "one" = 06/07/2017 - 10/11/2016
292 = T2-T0 for "two" = 05/07/2017 - 17/11/2016
你能帮我在SAS做吗


非常感谢。

当然有几种方法可以做到这一点。以下是两种选择。第一个为每个B选择第一个A,并在SQL步骤中将其与原始数据合并。第二种方法使用数据步骤和分组。每个B中的第一个A保存为firsttime,并保留,以便用于计算差异

data test;
    input A  ddmmyy10. @12 B $3.;
    format A ddmmyy10.;
datalines;
10/11/2016 one
17/11/2016 two
05/01/2017 one
28/02/2017 two
06/07/2017 one
05/09/2017 two
;

/*  Alt 1*/
proc sql;
    create table test2 as 
    select t1.*, t1.A-t2.A as time
    from test as t1 left join (select B, min(A) as A from test group by 1) as t2
        on t1.B=t2.B
    order by A;

/* Alt 2*/
proc sort data=test;
    by B A;
run;

data test3;
    set test;
        by B;
    retain firsttime;
    if first.B then firsttime=A;
    time=A-firsttime;
    drop firsttime;
run;

当然,有几种方法可以做到这一点。以下是两种选择。第一个为每个B选择第一个A,并在SQL步骤中将其与原始数据合并。第二种方法使用数据步骤和分组。每个B中的第一个A保存为firsttime,并保留,以便用于计算差异

data test;
    input A  ddmmyy10. @12 B $3.;
    format A ddmmyy10.;
datalines;
10/11/2016 one
17/11/2016 two
05/01/2017 one
28/02/2017 two
06/07/2017 one
05/09/2017 two
;

/*  Alt 1*/
proc sql;
    create table test2 as 
    select t1.*, t1.A-t2.A as time
    from test as t1 left join (select B, min(A) as A from test group by 1) as t2
        on t1.B=t2.B
    order by A;

/* Alt 2*/
proc sort data=test;
    by B A;
run;

data test3;
    set test;
        by B;
    retain firsttime;
    if first.B then firsttime=A;
    time=A-firsttime;
    drop firsttime;
run;

一种方法是拉出TIME='T0'记录并将它们与其他记录合并

首先,让我们将表转换为数据集

data have ;
  input b $ Time $ date :yymmdd.;
  format date yymmdd10.;
cards;
one T0 2016-11-10
two T0 2016-11-17
one T1 2017-01-05
two T1 2017-02-28
one T2 2017-07-06
two T2 2017-09-05
;
现在让我们对其重新排序,以便可以通过分组变量
B
进行合并

proc sort ;
  by b time ;
run;
下面是一种将数据与自身合并的方法

data want ;
  merge have(where=(time ne 'T0')) 
        have(keep=time b date rename=(time=time0 date=date0) where=(time0='T0'))
  ;
  by b ;
  diff = date - date0;
  drop time0;
run;
结果:

Obs     b     Time          date         date0    diff

 1     one     T1     2017-01-05    2016-11-10      56
 2     one     T2     2017-07-06    2016-11-10     238
 3     two     T1     2017-02-28    2016-11-17     103
 4     two     T2     2017-09-05    2016-11-17     292

一种方法是拉出TIME='T0'记录并将它们与其他记录合并

首先,让我们将表转换为数据集

data have ;
  input b $ Time $ date :yymmdd.;
  format date yymmdd10.;
cards;
one T0 2016-11-10
two T0 2016-11-17
one T1 2017-01-05
two T1 2017-02-28
one T2 2017-07-06
two T2 2017-09-05
;
现在让我们对其重新排序,以便可以通过分组变量
B
进行合并

proc sort ;
  by b time ;
run;
下面是一种将数据与自身合并的方法

data want ;
  merge have(where=(time ne 'T0')) 
        have(keep=time b date rename=(time=time0 date=date0) where=(time0='T0'))
  ;
  by b ;
  diff = date - date0;
  drop time0;
run;
结果:

Obs     b     Time          date         date0    diff

 1     one     T1     2017-01-05    2016-11-10      56
 2     one     T2     2017-07-06    2016-11-10     238
 3     two     T1     2017-02-28    2016-11-17     103
 4     two     T2     2017-09-05    2016-11-17     292

谢谢你,汤姆。我将在我的数据上测试它。。。祝你今天愉快。谢谢汤姆。我将在我的数据上测试它。。。祝您有个美好的一天。