2009-05-11 12 views
0

私は、実行したいcasenumのそれぞれの独自の観測に対して、その 'casenum'(下記参照)のさまざまな観測の間でクエリと算術演算が異なることがあります。たとえば、casenum 1234567の場合、コード0200 - コード0234または531 - 53のデータを減算したいと思います。このデータセットには何千もの観測値があることに注意してください。これを行うか、特定の行と比較する簡単な方法はありますか?SAS行の比較とクエリ?または他のソリューションが必要です。私は困惑している

はcasenumとコードが文字変数とデータですのでご注意ください。ここ

数値変数では、データセットが構成されている方法の例です。ここで

 
casenum code data 

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

はもののロジックです私がしようとしているものの文法的に間違っている可能性があります。私はそれを決定したい
ものcasenums内

casenumが同じコード観測の

、0100コードの 0234 + データコードのデータ場合 - コードNEのデータデータコード0200の場合はnewvariable = 'YES'

つまり、53 + 789 - 4597 ne 531の場合、テストしたいと思います。それ以降、他の同様の種類のテストがcasenum 1234567内で実行されているとします。次のカゼノムに移動し、そのカゼノムについて同じテストを実行します。

このデータセットには何十万もの観測データがあります。

答えて

1

私はあなたのロジックがコードのサブトラクションの部分であるかどうかは不明ですが、私が提案できる行のグループを選択するには不明です。一見すると、私はcasenumの異なる値のリストを得るでしょう。

proc sql; 
select distinct casenum 
into :casenum_list separated by ' ' 
from dataset; 
quit; 

ここで、すべての異なるcasenum値のリストがあるので、必要なロジックに従った行を繰り返します。私はこれが役に立てば幸い

%MACRO DOIT; 
%LET COUNT=1; 
%DO %UNTIL (%SCAN(&casenum_list,&COUNT) EQ); 

%LET CASENUM_VAR=%SCAN(&casenum_list,&COUNT); 

PROC SQL; 
SELECT 
<INSERT SOME SQL LOGIC HERE> 
FROM 
DATASET 
WHERE CASENUM=&CASENUM_VAR; 
QUIT; 

%LET COUNT=%EVAL(&COUNT+1);   

%MEND DOIT; 

%DOIT; 

:おそらくのような他のprocのSQL​​を使用して

。行内で成し遂げようとしていることをより深く理解することができれば、私はより具体化することができます。

0

私は本当にあなたの質問から助けに十分な情報を持っているとは思わないが、私はちょうどこれをスローします.... 行の比較を行う場合は、データのステップを使用することもできます。あなたが最初に使うことができる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 ; 

さらに必要な情報を投稿してください。

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 - _<> _0200 then newvariable="yes"; 
run; 

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

何らかの理由でこの式を動的にする必要があるかどうかをお知らせください。これは、あなたが何の問題もなく述べたデータの量に容易に拡大するはずです。あなたは、データの1回のパスでハッシュを使って同じ種類のことを行うこともできます。