2016-08-10 174 views
1

我正在使用SAS,並且正在嘗試將先前觀察的觀察值讀入當前觀察值。SAS - 從一個觀察值讀取值到另一個觀察值

這裏的數據是什麼樣子

Obs URN  Description Error_Bucket inputAcctNumber    count 
1 0100Base  Invalid Name AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1 
2 0100No Error No Error   0       2 
3 010007891023 No Error No Error  BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 1 
4 010007891023 A2/J2  Invalid Name  0       2 
5 010004567890 No Error No Error  CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1 
6 010004567890 A2/J2  Invalid Name  0       2 
7 010001354321 No Error No Error  DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD 1 

我創建了計數字段,並在這個例子中有使用相同的URN只有兩個意見,但在未來有可能是3 - 觀察N多與相同的URN號碼。我想要做的是給所有這些意見相同的InputAcctNumber具有相同的URN號碼,但現在他們都是0。我該如何做到這一點,特別是如果與骨灰盒「數量」的數量不明確。

理想的情況下,這是我希望我的數據是這樣的:

Obs URN  Description Error_Bucket inputAcctNumber    count 
1 0100Base  Invalid Name AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1 
2 0100No Error No Error  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2 
3 010007891023 No Error No Error  BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 1 
4 010007891023 A2/J2  Invalid Name BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 2 
5 010004567890 No Error No Error  CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1 
6 010004567890 A2/J2  Invalid Name CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2 
7 010001354321 No Error No Error  DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD 1 
+0

與有效ACCTNUMBER始終是一個與COUNT = 1的記錄?使用有效的AcctNumber可以有多個記錄嗎?如果是這樣,這些值可能會有所不同?如果是的話,你想使用哪一個? – Tom

+0

每個URN羣組中的填充帳號應始終爲Count 1.可能有2/3帳號具有填充帳號並共享URN號碼的情況 – DukeLuke

+0

因此,如果一個URN可以有兩個帳號,那麼您會選擇哪一個想用嗎?你可以通過只使用COUNT = 1的記錄來獲得它。 – Tom

回答

2

一個簡單的方法就是將inputAcctNumber變量合併回數據。

data want ; 
    merge have (drop=inputAcctNumber) 
     have (keep=URN inputAcctNumber where=(inputAcctNumber ne '0')) 
    ; 
    by URN; 
run; 

如果第一條記錄總是有正確的數字,那麼您可以創建一個新變量並保留該值。

data want; 
    set have ; 
    by urn count ; 
    if first.urn then new=inputAcctNumber; 
    retain new; 
    drop inputAcctNumber; 
    rename new=inputAcctNumber; 
run; 
+0

這會給它任何數量的觀察數NE 1? – DukeLuke

+0

它將採用inputAcctNumber的第一個值並將其複製到該URN值的所有記錄中。所以是的,它會處理每個URN的任何數量的記錄(即COUNT的任何值)。 – Tom

+0

這段代碼的哪一部分實際上在第二,第三,第n個觀察值中創建了Acct_numb?我看到first.urn然後new = acctnumb,但那隻會滿足count = 0的觀察,因爲它是第一個。保留新聲明是否將acctnumb的價值從一個甕的迭代中持續到下一個? – DukeLuke

0

,我想出了一個辦法,做你問什麼,用PROC SQL。我通過創建4個不同的表來做到這一點,最後一個是你想要的。這可能不是您最有效的方式,但您比我更瞭解您的數據。

代碼:

proc sql noprint; 
    create table b as 
    select * 
     from a 
     where count eq 1; 

    create table c as 
    select * 
     from a 
     where count ne 1; 

    create table d as 
    select c.URN, c.Description, c.Error_Bucket, b.inputAcctNumber, c.count 
     from b b inner join c c 
     on b.urn=c.URN 
      order by URN; 

    create table e as 
    select * 
     from b 
     outer union corresponding 
    select * 
     from c 
     order by URN; 
quit; 

輸出與數據集的 'e' 的一個PROC打印:

Obs URN Description Error_Bucket inputAcctNumber count 
1 100No Error No Error AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2 
2 100Base Invalid Name AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1 
3 10001354321 No Error No Error DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD 1 
4 10004567890 No Error No Error CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1 
5 10004567890 A2/J2 Invalid Name CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2 
6 10007891023 A2/J2 Invalid Name BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 2 
7 10007891023 No Error No Error BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 1 

完整說明:

(1)I由行的表中以「計數'等於1. (2)我做了另一個'count'不等於1的表格。 (3)然後我做了(2)中的表格內部連接, 「inputAc (1)中製作的表格中的「ctNumber」而不是(2)中製作的表格。 (4)然後,我將(3)中的表格附加到(1)中的表格中,然後按'URN'排序。

希望這是有幫助的。

+0

我看不到代碼的哪個部分給兩個觀察值賦予了acount數字值,而不僅僅是「null」或0給它... – DukeLuke

+0

當我創建表格時,將有效的inputAcctNumber分配給inputAcctNumber,並且缺少基於值的值在匹配的URN的內部連接上。 –

0

您可以使用retain語句讓SAS將以前的記錄值保留在datastep中。

假設數據進行排序,以便與有效inputAcctNumber記錄先發生,你可以像這樣使用代碼:

proc sort; by URN count; 

data test_output (drop=replacement); 
length replacement $50; 
retain replacement; 
set test_input; 
if trim(inputAcctNumber) = '0' then inputAcctNumber=replacement; 
output; 
if trim(inputAcctNumber) ne '0' then replacement=inputAcctNumber; 
run; 
+0

我可以通過URN,Count,然後帳號進行排序,這應該始終有效,對嗎? – DukeLuke

+0

我剛剛修改了代碼來處理每URN兩個以上的行。假設具有有效inputAcctNumber的URN在零之前,它顯示工作。它處理了你展示的示例數據。 – david25272

相關問題