2016-12-16 4 views
0

Я занимаюсь упражнениями из учебника SAS Programming 2.SAS: преобразование узкого в широкий набор данных

Я пытаюсь преобразовать эти данные:

Narrow Data set Для широкого набора данных, как это:

Wide Data Set Я также должен иметь массив в моем шаге данных и вывода только переменная customer_id и month1 - month12.

Мой код выглядит следующим образом:

Data customer_orders(keep=Customer_ID month1-month12); 
set orion.order_summary; 
by customer_id; 
array month{12} month1-month12; 
do i= 1 to 12; 
if order_month = i then  
month{i}= sale_amt; 
end; 

run; 

proc print data=customer_orders; 
run; 

Моя проблема, когда я запускаю этот код является то, что наблюдения не отображает все значения sale_amt для Customer_ID в одном наблюдении, но вместо этого происходит переход к следующей строке для отображения второе значение, обнаруженное в наблюдении.

Любая помощь была бы принята с благодарностью.

Примечание: Мне не разрешено размещать другую ссылку на то, как выглядит мой вывод.

+0

Необходимо использовать RETAIN для хранения переменных по строкам. В противном случае в каждой строке массивы vars будут отсутствовать. Вам также нужен явный оператор OUTPUT. – Reeza

ответ

1

Как было отмечено, вам нужно установить оператор сохранения для переноса ваших значений на следующую строку, поскольку SAS сбрасывает значения, отсутствующие на этапе обработки. Last.cust_id затем берет только последнюю строку на идентификатор клиента, и эта строка должна содержать все ваши наблюдения для этого клиента.

Это, однако, сохранит их для всех значений после этого, пока не будет указано иное. Таким образом, используя first.cust_id, вы можете установить все значения, отсутствующие на каждом новом идентификаторе клиента.

data test; 

input Cust_id Month Sale_Amt; 
Datalines; 
5 5 478 
5 6 126.8 
5 9 52.50 
5 12 33.8 
10 3 32.60 
10 1 200 
; 

run; 

proc sort data = test out = test_sort; 
    by cust_id month; 
run; 


data test2 (drop = month sale_amt i); 

    set test_sort; 
    by cust_id; 

    array holder (*) Month1-Month12; 

    retain Month1-Month12; 

    do i = 1 to 12; 
    if first.cust_id then holder{i} = .; 
    if month = i  then holder{i} = sale_amt; 
    end; 

    if last.cust_id; 

run; 

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

  • Нет связанных вопросов^_^