2016-07-05 3 views
0

У меня есть некоторые данные, которые выглядят такПервых и последняя функция SAS

data example1;  
    input Activity $ logflag; 
    Activity1 1 
    Activity2 1 
    Activity3 1 
    Activity4 1 
    Activity1 2 
    Activity2 2 
    Activity3 2 
    Activity1 3 
    Activity2 3 
    Activity3 3 
    Activity4 3 
    Activity1 4 
    Activity2 4 
    ; 
run; 

Где в основном переменная «logflag» увеличивается на 1 каждый раз возвращает «Действия» на «Activity1», однако я хочу, чтобы добраться до это;

data example2;  
    input Activity $ logflag count; 
    Activity1 1 1 
    Activity2 1 2 
    Activity3 1 3 
    Activity4 1 4 
    Activity1 2 1 
    Activity2 2 2 
    Activity3 2 3 
    Activity1 3 1 
    Activity2 3 2 
    Activity3 3 3 
    Activity4 3 4 
    Activity1 4 1 
    Activity2 4 2 
    ; 
run; 

Причем у меня есть «подсчет», который увеличивается на 1 каждый раз, когда новая «активность» появляется в определенном «logflag».

что я использую это;

data AS2.TENMAY_EXAMPLE4; 
    set AS2.TENMAY_SESSIONID; 
    by logflag Activity notsorted; 
    if first.logflag then count=0; 
    if first.Activity then count+1; 
run; 

и я получаю эту

data example2;  
    input Activity $ logflag count; 
    Activity1 1 1 
    Activity2 1 2 
    Activity3 1 2 
    Activity4 1 2 
    Activity1 2 1 
    Activity2 2 2 
    Activity3 2 2 
    Activity1 3 1 
    Activity2 3 2 
    Activity3 3 2 
    Activity4 3 2 
    Activity1 4 1 
    Activity2 4 2 
    ; 
run; 

То, что я не могу понять, почему счетчик увеличивается на 1 затем переходит на 2, но тогда не дойдет до 3 или выше. Я уверен, что у меня было это раньше, но я не могу понять, что я изменил.

Может ли кто-нибудь помочь?

Спасибо,

+1

Проверьте и убедитесь, что у вашего набора данных ввода нет переменной COUNT. – Tom

+0

Hi @Tom. Спасибо. Это на самом деле проблема. Почему должно иметь значение, что мой вход уже содержит переменную COUNT? – Taylrl

ответ

1

У вас должна быть переменная с именем COUNT во входном наборе данных. Таким образом, каждый раз, когда оператор SET запускает значение из входного набора данных, он перезаписывает значение из предыдущего наблюдения.

Чтобы получить ваш пример, COUNT, вероятно, 1 для каждого наблюдения. Таким образом, когда вы увеличиваете при изменении ACTIVITY, оно переходит в 2. Значение для первого наблюдения для каждой группы LOGFLAG равно 1, поскольку вы сначала установили его на 0, прежде чем увеличивать его.

0

Входные данные:

data example1; 
    attrib Activity format = $20. 
     logflag format = 8.; 
    input Activity $ logflag; 
    Activity1 1 
    Activity2 1 
    Activity3 1 
    Activity4 1 
    Activity1 2 
    Activity2 2 
    Activity3 2 
    Activity1 3 
    Activity2 3 
    Activity3 3 
    Activity4 3 
    Activity1 4 
    Activity2 4 
    ; 
run; 

Для того, чтобы результаты, что вы хотите попробовать это:

data example2; 
    set example1; 
    by logflag Activity notsorted; 
    if first.logflag then count=1; 
    else count+1; 
run; 

Результат:

Activity logflag count 
--------- ------- ----- 
Activity1 1  1 
Activity2 1  2 
Activity3 1  3 
Activity4 1  4 
Activity1 2  1 
Activity2 2  2 
Activity3 2  3 
Activity1 3  1 
Activity2 3  2 
Activity3 3  3 
Activity4 3  4 
Activity1 4  1 
Activity2 4  2 

enter image description here

+0

Я запустил этот код, и он по-прежнему дал мне то же самое, в результате чего счет не будет увеличиваться выше 2. Я вижу, что ваш код здесь должен работать, как и код, который я использовал выше. Я сбит с толку. – Taylrl

+0

@Taylrl, это фантастика :) –

+0

Здесь что-то очень странное. Мои результаты отличаются от ваших. Я буду исследовать и отчитываться: -S – Taylrl

0

Вам не хватает инструкции retain. Каждый раз, когда циклы datastep изменяются, переменная сбрасывается. Retain подавляет это поведение.

data AS2.TENMAY_EXAMPLE4; 
    set AS2.TENMAY_SESSIONID; 
    retain count; 
    by logflag Activity notsorted; 
    if first.logflag then count=0; 
    count+1; 
run; 
+0

Спасибо @Jetzler, хотя даже с этим утверждением 'keep' я все еще получаю то же самое, благодаря чему счетчик не будет увеличиваться до 2. Все решения, которые я бы подумал, должны были работать , Должно быть что-то нам не хватает – Taylrl

+1

Да, правильно. Просто проверил. Использование функции sum 'x + y;' имеет встроенную функцию сохранения.Так что все должно было работать. Поэтому проблема должна быть в ваших входных данных или в настройках вашей системы. – Jetzler

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