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 変数ですnum
。last.num
は、次の行の の値が異なる (1) か同じ (0) かを示す 1/0 変数ですnum
。これらは、何らかの方法でステートメントにfirst.id
first.name
表示される限り、任意の変数に使用できます (これらの変数に対してなどは機能します)。by
複数の変数がある場合by
ステートメントでは、その変数の左側にある変数がリセットされるたびに、それらがリセットされます。