SAS: выполнить циклическую справку: переменная = 1 от начала группы до маркера = 1

#sas #do-loops

#sas #циклы выполнения

Вопрос:

В SAS у меня есть данные, которые отсортированы по времени. В течение первых n минут переменная маркера помечается как 0, затем изменяется на 1. Это происходит внутри переменной ‘by’. Я хочу создать новую переменную, которая = 1 для каждой минуты с начала наблюдений группы ‘by’, пока переменная маркера не достигнет 1. Я перепробовал десятки комбинаций циклов выполнения и потерпел неудачу. Любая помощь будет оценена!

Комментарии:

1. Можете ли вы предоставить пример набора данных… как вы хотите, чтобы это выглядело в конце?

2. Для того, чтобы этот вопрос был хорошим вопросом, наверняка необходимы данные примера.

Ответ №1:

Из такого набора данных:

 by_var marker
A      0
A      0
A      1
B      0
B      0
B      1
  

Вы можете получить набор данных, который выглядит следующим образом (если каждое наблюдение занимает минуту):

 by_var marker minute
A      0      1
A      0      2
A      1      3
B      0      1
B      0      2
B      1      3
  

Из вашего набора данных путем сортировки by_var и использования простого data шага:

 data my_data2;
  set my_data;
  by by_var;
  if first.by_var then minute = 0;
  minute 1;
  output;
run;
  

Или вам нужно было изменить что-то подобное (с переменной времени):

 by_var marker time
A      0      12:34:01
A      0      12:34:59
A      0      12:35:01
A      0      12:36:12
A      1      12:36:50
B      0      12:34:01
B      0      12:34:09
B      0      12:34:59
B      0      12:36:12
B      1      12:37:50
  

К этому:

 by_var    marker      time         time2    minutes    Cumsum_minutes

  A          0      12:34:01           .       0           0
  A          0      12:34:59    12:34:01       0           0
  A          0      12:35:01    12:34:59       1           1
  A          0      12:36:12    12:35:01       1           2
  A          1      12:36:50    12:36:12       0           2
  B          0      12:34:01    12:36:50       0           0
  B          0      12:34:09    12:34:01       0           0
  B          0      12:34:59    12:34:09       0           0
  B          0      12:36:12    12:34:59       2           2
  B          1      12:37:50    12:36:12       1           3
  

код:

 data my_data;
  input by_var $ marker time time.;
  format time time.;
  cards;
  A 0 12:34:01
  A 0 12:34:59
  A 0 12:35:01
  A 0 12:36:12
  A 1 12:36:50
  B 0 12:34:01
  B 0 12:34:09
  B 0 12:34:59
  B 0 12:36:12
  B 1 12:37:50
  ;
run;

proc sort data=my_data;by by_var;run;

data final;
  set my_data;
  format time2 time.;
  by by_var;
  time2=lag(time);
  if first.by_var then do;
    minutes = 0;
    Cumsum_minutes = 0;
  end;
  else minutes=intck("minutes",time2,time);
  Cumsum_minutes minutes;
run;