0

実行したいcasenumの一意の観測ごとに、その'casenum'の'code'のさまざまな観測間でクエリと算術演算が異なるという状況があります(以下を参照)。たとえば、casenum 1234567の場合、コード0200-コード0234または531-53のデータを減算したいと思います。このデータセットには何千もの観測値があることに注意してください。これを行う、または特定の行との行比較を行う簡単な方法はありますか?

casenumとcodeは文字変数であり、dataは数値変数であることに注意してください

データセットがどのように構造化されているかの例を次に示します。

casenumコードデータ

1234567 0123 4597  
1234567 0234 53  
1234567 0100 789  
1234567 0200 531  
1234567 0300 354  
1111112 0123 79  
1111112 0234 78  
1111112 0100 77   
1111112 0200 7954  
1111112 0300 35

これが論理ですが、私がやろうとしていることは構文的に正しくない可能性があります。

casenumが同じであるコード観測の場合、それらのcasenum内で
、コード0234のデータ+コード0100のデータ-コード0123のデータne コード0200のデータthen newvariable ='YES'

つまり、53 + 789-4597 ne 531かどうかをテストしたいと思います。その後、casenum 1234567内で他の同様の種類のテストを実行し、次のcasenumに移動して、同じテストを実行します。そのcasenum。

このデータセットには数十万の観測値が含まれていることに注意してください。

4

3 に答える 3

1

式が固定されている場合(例が示唆しているように)、単純な転置を実行してからテストを明示的に宣言できない理由はありません。

/* Transpose the data by casenum */    
proc transpose data=so846572 out=transpose_ds;
    id  code;
    var data;
    by casenum;
run;

/* Now just explicitly write your conditional expression */  
data StackOverflow;
    set transpose_ds;

    if _0234 + _0100 - _0123 <> _0200 then newvariable="yes";
run;

ここで、so846572 =元のデータセット、transpose_ds =転置されたバージョン、StackOverflow=最終出力。

この式が何らかの理由で動的である必要があるかどうかをお知らせください。これは、問題なく言及したデータの量に簡単にスケーリングできるはずです。おそらく、データの1回のパスでも、ハッシュを使用して同じようなことを行うことができます。

于 2009-05-12T02:06:57.967 に答える
0

あなたの質問から十分な情報が得られたとは思いませんが、これを捨てます....行の比較を行いたい場合は、データステップを使用することもできます。データが casenum でソートされていると仮定すると、最初に使用できます。そして最後。新しい casenum があるときと、casenum の最後の行にいるときを判断します。行間のデータ値を合計したい場合、または複数回リストされた casenum の前の行に基づいて決定を下したい場合。

Data work.temp ;
 retain casenum_data ;

 set lib.data ;
 by casenum ;

 if first.casenum then do ;
   /* <reset hold vars> */
   casenum_data = 0 ;
 end ;

 if code = "0200" or code = "234" then .....


 if last.casenum then do ;
   /* output casenum summary */
   output ;
 end ;

run ;

必要性に関する詳細情報を投稿すると、より多くのヘルプを提供できます。

于 2009-05-11T15:08:45.110 に答える