2016-08-01 3 views
-6

Пожалуйста, кто-нибудь может помочь мне в вопросе поиска.найти количество чисел, число которых изменяется по id

я следующие фиктивные данные:

id num 
1 1 
1 2 
1 1 
1 2 
1 1 
1 2 
2 1 
2 15 
2 1 
2 1 
2 1 
2 15 
2 1 
2 15 

Как подсчитать количество раз NUM (колонка) изменяется для каждого идентификатора? Пожалуйста, найдите результаты и новый столбец. мне нужно результаты как этот

id number no_of_times 
1 1  1 
1 2  1 
1 1  1 
1 2  2 
1 1  1 
1 2  3 
2 1  1 
2 15  1 
2 1  1 
2 1  1 
2 1  1 
2 15  2 
2 1  1 
2 15  3 

Надеется, что вы можете понять, увидев результаты

+1

Из выборки данных, которые вы При условии, неясно, какую логику вы хотите использовать. Пожалуйста, не могли бы вы объяснить словами? – user667489

+0

Почему в течение трех первых наблюдений в вашем примере ничего не делается «1 2 1»? – superfluous

+0

Hi здесь его как назад anfd вперед. 1 назад, а 2 - в , нам нужно подсчитать только четвертое, сколько раз его движение вперед. каждый ID: так, когда он впервые не меняется от 1 до 2 означает не раз 1 на 1 и 2 в течение 1 , если он идет к спине (1) 1, что означает отсутствие изменений, но значение равно 1 если он снова идет от 1 до 2, что означает второй раз, когда он идет вперед (2), поэтому значение 1 для 1 и 2 для 2 , если оно идет в обратном направлении (1) 1, что означает отсутствие изменений, но значение равно 1 , если оно идет снова от 1 до 2, что означает, что он второй раз идет вперед (2), поэтому значение 1 для 1 и 2 для 3 надеюсь, что это имеет смысл. Спасибо – Ramu

ответ

0

Следующего хэша подход работает для тестовых данных, предоставленных с вопросом:

data have; 
input id number no_of_times_target; 
cards; 
1 1  1 
1 2  1 
1 1  1 
1 2  2 
1 1  1 
1 2  3 
2 1  1 
2 15  1 
2 1  1 
2 1  1 
2 1  1 
2 15  2 
2 1  1 
2 15  3 
; 
run; 

data want; 
    set have; 
    by id; 
    if _n_ = 1 then do; 
    length prev_number no_of_times 8; 
    declare hash h(); 
    rc = h.definekey('number','prev_number'); 
    rc = h.definedata('no_of_times'); 
    rc = h.definedone(); 
    end; 
    prev_number = lag(number); 
    if number > prev_number and not(first.id) then do; 
    rc = h.find(); 
    no_of_times = sum(no_of_times,1); 
    rc = h.replace(); 
    end; 
    else no_of_times = 1; 
    if last.id then rc = h.clear(); 
    drop rc prev_number; 
run; 
Смежные вопросы