SAS присвоение номеров и разделение по учетной записи

Я использую SAS EG и имею набор данных, который выглядит так:

CLIENT_ID    Segment     Yearmonth
XXXX         A            201305
XXXX         A            201306
XXXX         A            201307
YYYY         A            201305
YYYY         A            201306
YYYY         B            201307

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

CLIENT_ID    Segment      Yearmonth    New_Variable    
XXXX         A            201305         1
XXXX         A            201306         2
XXXX         A            201307         3
YYYY         A            201305         1
YYYY         A            201306         2
YYYY         B            201307         3

Это была проблема номер один, которую я решил с помощью этого кода:

PROC SORT DATA= GENERAL.HISTORICAL_SEGMENTS;
by Client_ID;
RUN;

data HISTORICAL_SEGMENTS2;
SET GENERAL.HISTORICAL_SEGMENTS;
count + 1;
by Client_ID;
if first.Client_ID then count = 1;
run;

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

CLIENT_ID    Segment      Yearmonth    New_Variable
YYYY         A            201305         1
YYYY         B            201306         2

Любая помощь будет оценена по достоинству. Спасибо.


person Data Guy    schedule 18.04.2017    source источник
comment
Пожалуйста, добавьте к вопросу, какой код вы пробовали (даже если это не сработало). Видя, как вы подошли к этому, часто помогает другим помочь вам учиться, а не просто дать вам ответ. Знакомы ли вы с RETAIN и групповой обработкой на шаге DATA (например, first.Account и last.Account)?   -  person Quentin    schedule 18.04.2017


Ответы (1)


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

data HISTORICAL_SEGMENTS2 ;
  set GENERAL.HISTORICAL_SEGMENTS ;
  by Client_ID ;
  if first.Client_ID then count = 0 ;
  count + 1 ;
run;

Я думаю, что принято ставить оператор BY сразу после оператора SET, к которому он применяется, для ясности. Сброс счетчика на 0 при изменении Client_ID.

Похоже, вам нужен второй набор данных, назовите его FIRSTS, с первой записью из каждой группы. Для этого обратите внимание, что для одного шага DATA можно записать несколько выходных наборов данных. Это можно сделать, используя явный оператор OUTPUT для записи в каждый набор данных, например. :

data HISTORICAL_SEGMENTS2 FIRSTS ;
  set GENERAL.HISTORICAL_SEGMENTS ;
  by Client_ID ;
  if first.Client_ID then count = 0 ;
  count + 1 ;
  output HISTORICAL_SEGMENTS2 ; *output every record;
  if first.Client_ID then output FIRSTS ;  *output first of each group;
run;
person Quentin    schedule 19.04.2017
comment
Спасибо за этот ответ. Теперь это имеет большой смысл. - person Data Guy; 20.04.2017
comment
все еще борюсь с этой логикой: HISTORICAL_SEGMENTS2 FIRSTS ; установить GENERAL.HISTORICAL_SEGMENTS ; по Client_ID ; если first.Client_ID, то count = 0 ; количество + 1; вывод HISTORICAL_SEGMENTS2 ; *выводить каждую запись; если first.Client_ID, то вывести FIRSTS ; * выводить первым из каждой группы; если второй.сегмент ‹› первый.сегмент, то вывести FIRSTS run; в основном мне нужна логика, в которой она сначала выводила бы в таблицу идентификатор клиента, только если сегмент отличается от предыдущего сегмента - person Data Guy; 20.04.2017
comment
Извините, я не понимаю. Предложите вам либо добавить это к текущему вопросу, либо, может быть, лучше начать новый вопрос с еще несколькими примерами записей, чтобы показать записи, которые вы хотели бы вывести с помощью этой новой логики. - person Quentin; 20.04.2017