Date 行差
我必须计算时间=0的第一个日期和之后的日期之间的日期差。我还有一个变量=因子,它有两类:一类;两个 例如,这里有一个日期: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 我想计算
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
谢谢你,汤姆。我将在我的数据上测试它。。。祝你今天愉快。谢谢汤姆。我将在我的数据上测试它。。。祝您有个美好的一天。