2016-08-10 7 views
1

私はSASを使用していますが、以前の観測値から現在の観測値へ観測値を読み取ろうとしています。観測のN数 - ここSAS - 1つの観測値から別の観測値への値の読み取り

データは、私がCountフィールドを作成し、この例では同じURNを持つ唯一の2つの観測があるが、将来的には3があるかもしれません

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番号を使用します。私がしようとしていることは、これらすべての観測に、同じURN番号を持つ同じInputAcctNumberを与えることですが、今はすべて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と1を持つレコードですか?有効なAcctNumberで複数のレコードを持つことは可能ですか?もしそうなら、値が異なる可能性はありますか?もしそうなら、あなたはどちらを使いたいですか? – Tom

+0

各URNグループ内の入力された口座番号は、常に1でなければなりません.2/3口座に人口統計番号があり、URN番号が – DukeLuke

+0

であるインスタンスが存在する可能性があります。したがって、1つのURNに2つの口座番号使用したいですか? COUNT = 1のレコードだけを使って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

これは、数NE1? – DukeLuke

+0

これはinputAcctNumberの最初の値をとり、その値をURNのすべてのレコードにコピーします。そう、はい、それはURNごとのレコードの数を扱います(つまり、COUNTの任意の値)。 – Tom

+0

このコードのどの部分が実際に2番目、3番目、n番目の観測でAcct_numbを作成していますか? first.urn then new = acctnumbが見えますが、これは最初からカウント= 0の観測値を満足するに過ぎません。保持する新しいステートメントは、urnの次の繰り返しからacctnumbの値を保持していますか? – DukeLuke

0

私はPROCのSQLを使用して、あなたが求めて何をすべきかの方法を作ってみました。私は4つの異なるテーブルを作成して、最後のものをあなたが望むテーブルにすることでこれを行います。これはあなたがこれを行うための最も効率的な方法ではないかもしれませんが、あなたはあなたのデータを私よりもよく知っています。

コード:データセットのPROC印字の

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':

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)私は、カウント」で行の表を作りました'1と等しい。 (2)'カウント 'が1と等しくない別のテーブルを作った。 (3)(1)で作られたテーブルの(2)で作られたテーブルの内部結合'inputAc (2)で作られたものの代わりに(1)で作られたテーブルからのctNumber。 (4)(1)で作成したテーブルに(3)で作成したテーブルを追加し、次に「URN」でソートしました。

うまくいけば、これは役に立ちます。

+0

コードのどの部分がacount番号の値を "null"か0だけではなく、両方の観測値に与えているかわかりません... – DukeLuke

+0

テーブルdを作成すると、有効なinputAcctNumberをinputAcctNumberに不足している値に割り当てます一致するURNの内部結合で –

0

あなたはSASがdatastep内の前のレコードの値を保持するために取得するためにretainステートメントを使用することができます。

有効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、カウント、アカウント番号でソートできました。これはいつも正しく動作するはずですか? – DukeLuke

+0

URNあたり2つ以上の行を処理するコードを変更しました。有効なinputAcctNumberを持つURNが0の前に来ると仮定すると、それは動作を示します。これは、あなたが示したサンプルデータに作用しました。 – david25272

関連する問題