2015-09-16 5 views
0

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

+0

См. [«Если вопросы включают« теги »в их названиях?»] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), где консенсус «нет, они не должны»! –

+0

@AndreasNiedermair Почему бы не изменить его? – Joe

ответ

2

Добро пожаловать в переполнение стека! Давайте предположим, что ваш набор данных выглядит так:

У

Obs Var1 
1 Mazda 
2 Ford 
3 BMW 

Хотите

Obs Date  Var1 
1 01JAN2015 Mazda 
2 02JAN2015 Ford 
3 03JAN2015 BMW 

Вы можете использовать Sum Statement с SAS Date Literal для достижения этой цели.

data want; 
    format Date date9. /* Makes date the first var, looks prettier */ 
    set have; 
    if(_N_ = 1) then Date = '31DEC2014'd; /* Set initial value */ 
    Date+1; /* Increment SAS date value by 1 day for each day */ 
run; 

Если вы раньше не использовали автоматическую переменную N, это итерация счетчик каждый раз, когда SAS выходит из верхней части шага данных в нижней части.

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

data WontWork; 
    set have; 

    Add_Me = 1; 

    /* Do loop just simulates dataset iterations */ 
    do i = 1 to 10;   
     Add_Me = Add_Me + 1; 
     output; 
    end; 

drop i; 
run; 

Объяснение

Всякий раз, когда SAS проходит через одну итерацию шага данных, программа Data Vector (PDV) сбрасывает все неавтоматических переменные отсутствуют. Чтобы исправить это, вы должны либо использовать оператор Retain, либо затем увеличивать эту переменную, либо использовать заявление о сумме для выполнения как сохранения, так и суммирования переменной. Операторы Retain/Sum сообщают SAS, чтобы помнить последнее значение переменной, чтобы она не терялась, когда она повторяется через шаг данных. Одно уникальное свойство оператора keep заключается в том, что вы можете установить начальное значение. По умолчанию оператор сохранения инициализирует переменную как отсутствующую. Оператор sum всегда инициализирует переменную как отсутствующую.

data works; 
    retain Add_Me 0; 

    /* Do loop just simulates dataset iterations */ 
    do i = 1 to 10; 
     Add_Me = sum(Add_Me, 1); 
     output; 
    end; 

drop i; 
run; 

ИЛИ

data works2; 

    /* Do loop just simulates dataset iterations */ 
    do i = 1 to 10; 
     Add_Me+1; 
     output; 
    end; 

drop i; 
run; 

Обратите внимание, что заявление сумма делает оба этих шагов, а также обрабатывает пропущенные значения. Подумайте об этом как о ярлыке.

Я надеюсь, что это разрешило вашу проблему, и снова добро пожаловать в переполнение стека!

+0

Спасибо, я не знаю, как я не мог думать об этом, я даже использовал _n_ в переменной до даты .. Глупый мне – coderX

Смежные вопросы