SAS и Date операции - PullRequest
       6

SAS и Date операции

0 голосов
/ 19 января 2012

Я попробовал поискать в Google, и мне не повезло с моей текущей проблемой. Возможно, кто-то может помочь?

У меня есть набор данных со следующими переменными:

ID, дата аварии

Это в длинном формате, и каждый участник может иметь более 1 несчастного случая, причем участники не обязательно имеют одинаковое количество несчастных случаев. Вот образец:

Код:

ID  AccidentDate
1   1JAN2001
2   4MAY2001
2   16MAY2001
3   15JUN2002
3   19JUN2002
3   05DEC2002
4   04JAN2003

Что мне нужно сделать, так это подсчитать количество дней между каждым человеком Первая и последняя записанная дата аварии. Я играл с командами first.byvariable и last.byvariable, но я просто не прогрессировал. Какие-нибудь советы? Или есть ссылки на источник?

Спасибо,

Также. Первоначально я разместил это на Talkstats.com (перекрестный этикет)

Ответы [ 3 ]

4 голосов
/ 19 января 2012

Не уверен, что вы имеете в виду в длинном формате длинный формат должен быть таким:

  id     accident  date
  1       1       1JAN2001 
  1       2       1JAN2002 
  2       1       1JAN2001 
  2       2       1JAN2003 

Тогда вы можете попробовать proc sql вот так

Proc Sql;
select id, max(date)-min(date) from table;
group by id;
run;
0 голосов
/ 19 января 2012

Предполагая, что данные выглядят так:

ID  AccidentDate 
1   1JAN2001 
2   4MAY2001 
2   16MAY2001 
3   15JUN2002 
3   19JUN2002 
3   05DEC2002 
4   04JAN2003

У вас правильная идея. Сохраните дату первой аварии, чтобы иметь доступ как к первой, так и к последней дате. Затем рассчитайте разницу.

proc sort data=accidents;
  by id accidentdate
run;

data accidents; 
  set accidents;
  by id;
  retain first_accidentdate;
  if first.id then first_accidentdate = accidentdate;
  if last.id then do;
    daysbetween = date - first_accidentdate
    output;
  end;
run;
0 голосов
/ 19 января 2012

Под длинным форматом я думаю, что вы имеете в виду, что это «сложенный» набор данных с каждым человеком, имеющим несколько наблюдений (вместо одной строки на человека с несколькими столбцами).В вашей ситуации это, вероятно, правильный способ хранения данных.

Чтобы сделать это с помощью шагов с данными, я думаю, что вы на правильном пути с первым.и последний.

Я бы сделал это так:

proc sort data=accidents;
  by id date;
run;

data accidents; set accidents;
  by id accident; *this is important-it makes first. and last. available for use;
  retain first last;
  if first.date then first=date;
  if last.date then last=date;
run;

Теперь у вас есть набор данных с идентификатором, датой, датой первого происшествия, датой последнего происшествия

Вы можете посчитать время между с помощью

data accidents; set accidents;
  timebetween = last-first;
run;

Вы не можете сделать это напрямую на одном шаге данных, так как переменная «last» не будет точной, пока она не проанализирует последнюю строку, и поэтомуданные будут неверны ни для чего, кроме последнего наблюдения за аварией.

...