2

私は MatLab でのコーディングに慣れていますが、Do ループを使用する場合、SAS はまだ初めてです。私の目標は、現在の行の上/前の行をチェックして、現在と前の行番号が一致するかどうかを確認することです。最初の行の上のベクトル データが現在の行と一致する場合、これを確認できるようにしたいと考えています。

数値 (列ベクトル) = 123,123,134,156,290,348,596,569,569

/*---- Do-Loop ----*/
data full;
set work.Test;
 count=_N_;

do i=1 to count;
    Current = Num(i);
    Prev = Num(i-1);
end;

run;

私にとって、「Current」はベクトル「Num」のi番目のセルを参照し、「Prev」は「Current」セルの前のi番目のセルを参照する必要があります。誰でも私を助けることができますか?

4

3 に答える 3

1

SAS は、Matlab にはベクトルと行列があり、ベース SAS にはないという点で、Matlab とは大きく異なります。Base SAS はマトリックス言語よりも SQL に近いです。行内の列を操作します。SAS をマトリックス言語のように扱いたい場合は、ライセンスを取得しているかどうかを確認してくださいSAS-IML(PROC SETINIT; RUN;ライセンスの内容が表示されるか、SAS 管理者に問い合わせてください)。その言語は、Matlab と非常によく似ています。

これを解決するためにベース SAS を使用する限り、何をするかは目的によって異なります。すべての行を前の行 [または次の行、これら 2 つの目標は同一であるため] と比較するだけの場合は、 を使用して簡単に行うことができますPROC COMPARE

例えば:

data class_one/view=class_one;
set sashelp.class(firstobs=2);
run;

proc compare base=sashelp.class compare=class_one out=class_compare;
run;

PROC COMPARE必要なものを正確に取得するための多くのオプションがあります。詳細については、ドキュメントを参照してください。

次の行へのマッチ マージも非常に簡単に実行できます。

data want;
merge sashelp.class(in=a) sashelp.class(in=b firstobs=2 rename=(...) keep=...);
... do stuff ...
run;

ただし、2番目のデータセットから入ってくる変数の名前を変更する必要があります。そうしないと、最初のデータセットの変数が上書きされ、keepオプションを使用して作業中のもののみを保持し、keep名前が変更されたものではなく元の名前を使用するためです。名前。次に...do stuff...、行を次の行と比較するために使用しているコードを入力します。「前の行」が重要な場合 (つまり、[1..n-1] ではなく行 [2..n] が最終出力として必要な場合)、firstobs=2 を最初のデータセットに移動します。(これは、最初の観測をスキップするように指示するため、1 つのデータセットが 1 で開始し、もう 1 つのデータセットが 2 で開始し、両方がそれを超えて反復します。)

行番号を確認するだけなら、これは少し簡単です。あなたはこれを行うことができます:

data want;
set have;
by num notsorted; *notsorted is needed unless you do expect it to be in numeric order;
if first.num then first_obs_for_rownum=1;
if last.num then last_obs_for_rownum=1;
run;

明らかに、これらの節で他のことを行うことができますthen。私は、それらが何をするかを明確にしようとしています。 if first.num and last.num行が行番号によって一意であることを示します(少なくとも、データセットの順序で-ソートされていない場合、同じ番号が他の場所に表示される可能性がありますが、その行の直前/直後には表示されません)。 first.numは、前の行の の値が異なる (1) か同じ (0) かを示す 1/0 変数ですnumlast.numは、次の行の の値が異なる (1) か同じ (0) かを示す 1/0 変数ですnum。これらは、何らかの方法でステートメントにfirst.id first.name表示される限り、任意の変数に使用できます (これらの変数に対してなどは機能します)。by複数の変数がある場合byステートメントでは、その変数の左側にある変数がリセットされるたびに、それらがリセットされます。

于 2014-04-04T16:10:51.690 に答える