Sas 非计划访问的访问

Sas 非计划访问的访问,sas,Sas,我有以下数据集:我正在尝试根据可用日期为计划内和计划外就诊分配就诊编号。如果日期不同,则我希望增加计划外就诊编号(即:101.1101.2)。但是,如果计划外访问的日期相同,则我希望在各行中保持恒定的访问次数(即2次或更多具有相同访问次数的计划外访问,即101.1101.1) 我想将avisitn分配如下: 1 1 screening 10oct2017 101 1 1 screening 10oct2017 101 1 99 unscheduled

我有以下数据集:我正在尝试根据可用日期为计划内和计划外就诊分配就诊编号。如果日期不同,则我希望增加计划外就诊编号(即:101.1101.2)。但是,如果计划外访问的日期相同,则我希望在各行中保持恒定的访问次数(即2次或更多具有相同访问次数的计划外访问,即101.1101.1)

我想将avisitn分配如下:

    1 1  screening   10oct2017   101
    1 1  screening   10oct2017   101
    1 99 unscheduled 10oct2017   101.1
    1 99 unscheduled 11oct2017   101.2
    1 2  day-1       12oct2017   102
    1 2  day-1       12oct2017   102
    1 3  day1        16oct2017   103
    1 99 unscheduled 15oct2017   103.1
我已尝试使用以下代码:

data test;
infile cards dlm=" ";
input subject visit event$11. date:date9.;
format date date9.;
cards;
1 1  screening   10oct2017
1 1  screening   10oct2017
1 99 unscheduled 10oct2017
1 99 unscheduled 11oct2017
1 2  day-1       12oct2017
1 2  day-1       12oct2017
1 3  day1        16oct2017
1 99 unscheduled 15oct2017
;
run;

proc sort data=test;
by subject date visit;
run;

data test1;
   set test;
   by subject date visit;

   fp = first.subject;
   lp = last.subject;
   fo = first.date;
   lo = last.date;
run;

data test2;
   set test1;
   by subject date visit;

   retain avisitn;

   prev_patient_num = lag(subject);
   prev_ordering_date = lag(date);

   if visit ne 99 then do;
       if first.subject then avisitn = 101;
       else if subject = prev_patient_num and date ne prev_ordering_date then avisitn + 1;
   end;

    if visit eq 99 then do;
        avisitn+0.1;
    end;    

   keep subject date visit avisitn;
run;
但是,我得到以下输出

subject visit    date     avisitn
1        1     10OCT2017    101
1        1     10OCT2017    101
1       99     10OCT2017    101.1
1       99     11OCT2017    101.2
1       2      12OCT2017    102.2
1       2      12OCT2017    102.2
1      99      15OCT2017    102.3
1       3      16OCT2017    103.3

请帮我解决这个问题。提前感谢。

在您的尝试中,您可以按主题和日期进行排序。但是,在原始样本中,最后两行的日期是无序的。最后两个需要值(103和103.1)基于未排序的数据

对于已排序的数据,当日期更改时,可以使用“提前1”之前的楼层。跟踪太多.1增量是个好主意

data want;
  set test;
  by subject date;

  retain avisitn;

  prev_date = lag(date);

  if first.subject then do;
    avisitn = 101;
    _99s = 0;
    if visit eq 99 then do; _99s + 1; avisitn + 0.1; end;
  end;
  else
  if visit eq 99 then do;
    _99s + 1;
    if _99s = 10 then do; put 'ERROR: Too many 99s' ; abort cancel; end;
    avisitn + 0.1;
  end;
  else
  if date ne prev_date then
    avisitn = floor(avisitn) + 1;

  drop prev_date;
run;
如果您需要按照原始顺序进行处理,比如在事务性事件日志记录顺序中,那么有一些解决方案,但是它们可能并不“流畅”,并且需要跟踪“奇怪”排序情况的状态

data want;
  set test;
  by subject date;

  retain avisitn;

  prev_date = lag(date);

  if first.subject then do;
    avisitn = 101;
    _99s = 0;
    if visit eq 99 then do; _99s + 1; avisitn + 0.1; end;
  end;
  else
  if visit eq 99 then do;
    _99s + 1;
    if _99s = 10 then do; put 'ERROR: Too many 99s' ; abort cancel; end;
    avisitn + 0.1;
  end;
  else
  if date ne prev_date then
    avisitn = floor(avisitn) + 1;

  drop prev_date;
run;