SAS:行差异

时间:2019-06-27 10:47:21

标签: date sas rows

我必须计算时间= 0处的第一个日期与之后的日期之间的日期差。我也有一个变量=因数,它有2类:一种;二。

例如,这是一个日期:

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 =“ one”和B =“ two”的日期之间的差,以获得:

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中做到吗?

非常感谢。

2 个答案:

答案 0 :(得分:3)

一种方法是提取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

答案 1 :(得分:1)

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

"dependencies": {
    "babel-plugin-transform-remove-console": "^6.9.4",
    "formik": "^1.5.4",
    "lodash": "^4.17.11",
    "moment": "^2.24.0",
    "moment-timezone": "^0.5.25",
    "native-base": "^2.12.1",
    "react": "16.8.6",
    "react-native": "0.59.8"
    ....
}
"devDependencies": {
    "babel-jest": "24.8.0",
    "babel-preset-react-native": "4.0.1",
    "jest": "24.8.0",
    "react-test-renderer": "16.8.6",
    "run-script-os": "~1.0.5"
  },