2016-12-16 144 views
0

我正在從SAS編程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; 

我的問題,當我運行這段代碼是觀測並不在一個觀察顯示所有CUSTOMER_ID的sale_amt值,而是跳到下一行顯示觀察中發現的第二個值。

任何幫助將不勝感激。

注意:我不允許發佈另一個鏈接到我的輸出看起來像。

+0

您需要使用RETAIN來保持跨行的變量。否則,在每一行中,數組變量都被設置爲丟失。你還需要一個明確的OUTPUT語句。 – Reeza

回答

1

正如已評論的那樣,您需要設置一個保留語句以將您的值傳送到下一行,因爲SAS會在處理步驟中重置要丟失的值。 Last.cust_id然後僅取每個客戶ID的最後一行,並且該行應包含該客戶的所有觀察值。

然而,這將保留它們以後的所有值,直到另有規定爲止。因此,使用first.cust_id可以將每個新客戶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;