2016-07-20 15 views
1

以下是一個示例數據集。下面的方案代表了一個賬戶交易歷史清單:根據不同的羣組,用前一個或下一個觀察值替換缺失值

  • 兩個客戶A和B;
  • 客戶A在Bank BA和Bank UB擁有5個賬戶1,2,3,4,5;
  • 客戶B在Bank WF擁有2個賬戶1,6,
  • 請注意,WF銀行已向B發出了一個與A銀行相同的賬戶ID(實際上這可能是真實的)。

    data have; 
    input Customer $ Account_id Bank_id $ Year; 
    datalines; 
    A 1 BA . 
    A 2 UB . 
    A 3 UB 2012 
    A 3 UB . 
    A 4 UB . 
    A 4 UB 2013 
    A 5 UB . 
    B 1 WF 2014 
    B 1 WF . 
    B 6 WF . 
    ; 
    

一些開放日期缺少的帳戶,但相同的帳戶,打開日期應該是相同的。我想要做的是用其先前/後來的值替換帳戶的缺失日期,如果有的話;否則,保持它爲空。

data want; 
    input Customer $ Account_id Bank_id $ Year; 
    datalines; 
    A 1 BA . 
    A 2 UB . 
    A 3 UB 2012 
    A 3 UB 2012 
    A 4 UB 2013 
    A 4 UB 2013 
    A 5 UB . 
    B 1 WF 2014 
    B 1 WF 2014 
    B 6 WF . 
    ; 

我看了看這個例子:How to write first non-missing value to first missing observations這是有益的,但我無法調整它爲我的情況下,有多個團體合作。

回答

0

您可以在一個單一的proc sql一步做到這一點:

 
proc sql ; 
    create table want2 as 
    select a.Customer, a.Account_id, a.Bank_id, max(a.Year,b.Year) as Year 
    from have a 
     left join 
     (select Customer, Account_id, Bank_id, max(Year) as Year 
     from have 
     group by Customer, Account_id, Bank_id) b on a.Customer = b.Customer 
                and a.Account_id = b.Account_id 
                and a.Bank_id = b.Bank_id ; 
quit ; 
+0

嗨克里斯,這兩個代碼塊都沒有通過,因爲這裏有一些錯誤。 –

+0

不用擔心克里斯。這個proc sql步驟工作得很好,非常整潔的左連接步驟。非常感謝。 –

0

這應做到:

proc sort data=have; 
    by Customer 
    Bank_id 
    Account_id 
    descending Year; 
run; 

data want; 
    set have; 
    by Customer Bank_id Account_id; 
    retain year_tmp (.); 

    if not last.Account_id and Year ne . then year_tmp=Year; 
    else if Year = . then Year = year_tmp; 
    if last.Account_id then year_tmp = .; 

    drop year_tmp; 
run; 

我們所做的是宣佈保留變量,就是一個信守從一行到下一行的值。然後使用last標誌,我們將該現有Year存儲在該保留變量中(或將已存儲的值歸入缺少的年份)。最後,我們重置每個Account_id最後一行的retain變量。

+0

這對我的情況非常好!謝謝多米尼克。 –

相關問題