2012-01-19 2 views
0

Я пробовал поиск в Интернете, и у меня не было никакой удачи в моей текущей проблеме. Может, кто-то может помочь?Операции SAS и даты

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

ID, дата Accident

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

Код:

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

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

Спасибо,

Также. Я отправил это первоначально более в Talkstats.com (кросс-постинг этикета)

+0

Наши FAQ перенаправляют вас в [список ресурсов] (http://meta.stats.stackexchange.com/a/816) для чисто программно-ориентированных вопросов, подобных этому. Проверьте это! Вы также можете спросить о SO - я перенес вам вопрос, чтобы вы сохранили работу. – whuber

ответ

4

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

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

Тогда вы можете попробовать ргос SQL, как это

Proc Sql; 
select id, max(date)-min(date) from table; 
group by id; 
run; 
+0

Ницца ... даже когда данные такие, как @jamesmartinn, этот метод работает –

0

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

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

Я хотел бы сделать это следующим образом:

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; 

Теперь у вас есть набор данных с ID, дата, дата первой аварии, Дата последнего аварии

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

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

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

0

Предполагая, что данные выглядит следующим образом:

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; 
Смежные вопросы