2016-06-29 43 views
0

我想基于基准日期(在我的数据集中称为baseline_doc)为所有client_id的相同分组标记第一个和最后一个观测值。在sas中的第一个和最后一个观察

例如,我希望我的最终数据集是这样的:

Client_id Baseline_Date  First.baseline_doc Last.baseline_doc 
--------- ------------------ ------------------ ----------------- 
1   April 1 2016  0      0 
1   April 20 2016  0      1 
1   January 1 2016  1      0 
2   January 1 2016  1      0 
2   January 20 2016  0      1 
3   February 20 2016 1      1 

注意如何CLIENT_ID第一个和最后的类似的分组中被边裁CLIENT_ID的第一个实例,并且CLIENT_ID的最后一个实例,然后WITHIN每个client_id分组的第一个和最后一个观察被标记 - first.baseline_doc中的第一个日期被标记为1并且最后日期(或最近的)被标记为last.baseline_doc 这是我正在使用的代码:

data FA_CA_DADOS_CLEAN_DELETED; 
    set fa_ca_dados_clean2; 
    by client_id baseline_doc; 
    firstclient_id = first.client_id; 
    lastclient_id = last.client_id; 
    firstBaseline_doc = first.baseline_doc; 
    lastBaseline_doc = last.baseline_doc; 
run; 

但是,我的代码并没有像我想要的那样给我输出。发生了什么是每个client_id被标记为last.baseline_doc的1,但肯定有一些应该是0 b/c我有不同日期的client_id重复。

我在做什么错?

我直接从这个资源复制此代码: https://onlinecourses.science.psu.edu/stat481/node/9

,它有我想,所以我不知道是怎么回事输出。

我按照client_id和baseline_doc排序,然后运行上面的代码!

有人可以帮我吗?

+0

你一定不明白。 'first.something'意味着这个观察结果是第一个具有某种“某事”的观察结果。如果您将'first.baseline_doc'用于完全不同的概念,那么您真的很困惑你的同事。 –

+0

也许你应该首先根据Client_id Baseline_Date对输入数据进行排序? –

回答

1

中的数据以

data myData; 
    input @01 Client_id 1. 
     @03 Baseline_Doc date9. ; 
    format Baseline_Doc yymmdd10.; 
    datalines; 
1 1Apr2016 0 0 
1 20Apr2016 0 1 
1 1Jan2016 1 0 
2 1Jan2016 1 0 
2 20Jan2016 0 1 
3 20Feb2016 1 1 
; 
run; 

看完这将做的工作:

proc sql; 
    select all.* 
     , case baseline_Doc when baseline_min then 1 else 0 end as baseline_start 
     , case baseline_Doc when baseline_max then 1 else 0 end as baseline_stop 
    from myData all inner join 
    ( select Client_id 
      , min(baseline_doc) as baseline_min 
      , max(baseline_doc) as baseline_max 
     from myData 
     group by Client_id) as min_max on all.Client_id = min_max.Client_id; 
quit; 

但是,它可以给不愉快的意外,因为根据SQL的规格,它没有保持秩序。

0

如果我理解正确,你想标记每个client_id中的最早和最晚的日期。为此,您需要查找first.client_id和last.client_id,而不是first.baseline_doc和last.baseline_doc。将first.x/last.x认为等同于'这是当前x值的第一行/最后一行'。

试试这个:

data myData; 
    input @01 Client_id 1. 
     @03 Baseline_Doc date9. ; 
    format Baseline_Doc yymmdd10.; 
    datalines; 
1 1Apr2016 0 0 
1 20Apr2016 0 1 
1 1Jan2016 1 0 
2 1Jan2016 1 0 
2 20Jan2016 0 1 
3 20Feb2016 1 1 
; 
run; 

proc sort data = mydata; 
    by client_id baseline_doc; 
run; 

data want; 
    set mydata; 
    by client_id; 
    first_baseline_doc = first.client_id; 
    last_baseline_doc = last.client_id; 
run; 
+0

与你的答案,你将不会有结果数据,希望看到@chiccaboomberry –

-1
data myData; 
    input @01 Client_id 1. 
     @03 Baseline_Doc date9. ; 
    format Baseline_Doc yymmdd10.; 
    datalines; 
    1 1Apr2016 0 0 
    1 20Apr2016 0 1 
    1 1Jan2016 1 0 
    2 1Jan2016 1 0 
    2 20Jan2016 0 1 
    3 20Feb2016 1 1 
    ; 
run; 
proc sort data = mydata; 
    by client_id baseline_doc; 
run; 

data want; 
    set mydata baseline_doc; 
    by client_id baseline_doc; 
    if first.client_id then First.baseline_doc = 1; 
    else First.baseline_doc = 0; 
    if last.client_id then Last.baseline_doc = 1; 
    else Last.baseline_doc = 0; 
run; 
+0

这不会回答问题(第一个和最后一个。变量总是被删除),它是因为使用first.baseline_doc而引起的混淆,以及除此之外,它几乎与我的答案完全相同。 – user667489

0

如果你想确保100%的顺序被保存,你可以做到这一点

排序在基准日期的升序输入,但请记住原始观察号码;

data myInput; 
    input @01 Client_id 1. 
     @03 Baseline_Doc date9. ; 
    format Baseline_Doc yymmdd10.; 
    obsNr = _N_; 
    datalines; 
1 1Apr2016 0 0 
1 20Apr2016 0 1 
1 1Jan2016 1 0 
2 1Jan2016 1 0 
2 20Jan2016 0 1 
3 20Feb2016 1 1 
; 
run; 
proc sort data = myInput out=myTemp; 
    by client_id baseline_doc; 
run; 

马克的第一个和最后的基线日期;

data myTemp; 
    set myTemp; 
    by client_id baseline_doc; 
    baseline_start = first.client_id; 
    baseline_end = last.client_id; 
run; 

恢复原始顺序和忘记obsNr;

proc sort data = myTemp out=myResult(drop=obsNr); 
    by obsNr; 
run; 
相关问题