BookmarkSubscribeRSS Feed
chie_sas
Obsidian | Level 7

いつもお世話になっております。

 

テーブル内にある変数の内、まったく同一の値を持つ変数を特定したいのですが、

何か方法はないでしょうか?

EGのタスクが望ましいですが、PGMでも結構です。

 

相関係数でと考えていましたが、同一の値でなくても相関係数が1になるので、

この他の方法でと考えています。

よろしくお願いいたします。

5 REPLIES 5
Rick_SAS
SAS Super FREQ
Data Have;
input x y z w q;
datalines;
0 1 2 1 .
0 2 2 1 .
1 3 2 . .
1 4 2 1 .
;

proc means data=Have N NMISS Min Max stackods;
var _NUMERIC_;
ods output Summary=Summary;
run;

data Want;
set Summary;
if N=0 | NMISS=0 & (Min = Max); /* <=== */
run;

proc print data=Want;
run;

Tom
Super User Tom
Super User

Or use PROC FREQ.

proc freq data=have nlevel ;
  ods output nlevels=nlevels;
  tables _numeric_ / noprint;
run;

proc print data=nlevels;
 where nlevels=1;
run;
                                            NNon
       Table                   NMiss        Miss
Obs     Var      NLevels      Levels      Levels

 3       z             1           0           1
 5       q             1           1           0
yu_sas
SAS Employee

I think chie_sas wants to identify two variables that have same values. So try something like this

 

Data Have;
input x y z w q;
datalines;
0 1 2 3 3
0 2 2 4 4
1 3 2 5 5
1 4 2 6 6
;

data want(keep=name1 name2);
if _n_=0 then set have;
array num{*} _numeric_;
do i=1 to dim(num);
 do j=i+1 to dim(num);
  flg=0;
  do k=1 to n;
  set have point=k nobs=n;
  flg+num{i}^=num{j};
  end;
  if flg=0 then do; name1=vname(num{i});
        name2=vname(num{j}); output; end;
 end;
end;
stop;
run;

 

sasone
Quartz | Level 8

テーブル中の文字列同士の値の比較もできるよう拡張しました。

Data Have;
length x y $10 z $5;
input x y z w q;
datalines;
a A A 3 3
b B B 4 4
c C C 5 5
d D D 6 6
;
run;

*---同一変数を探したいテーブル名を指定する;
%let _indt=Have;

proc contents data=&_indt. out=cont noprint;
run;
proc sort data=cont out=A(keep=name varnum);
  by varnum;
run;
data B;
  set A(rename=(name=NAME2 varnum=varnum2));
run;
proc sql noprint;
  create table C as select name,name2 from A, B where varnum<varnum2;
  select '%compare('||strip(name)||','||strip(name2)||');' into:_repeat separated by '' from C;
quit;
data cum; run;
%macro compare(_var,_with);
proc compare data=&_indt. noprint;
  var &_var.; with &_with.;
run;
%let comp=&sysinfo.;
data comp;
  comp=&comp.;
run;
data cum; set cum comp; if comp=. then delete; run;
%mend compare;
&_repeat.;
data want;
  merge C cum;
run;

テーブル内の変数の2組の順列組み合わせを全て作ってから、2変数同士を対決させております。
同値であればデータセットwantの変数compに0が入力されております。文字値同士の比較は
Length(属性)は異なっていても内容が同値であれば0が返されます。comp=0以外の数値の細かい意味までは
判りかねます。

chie_sas
Obsidian | Level 7
皆様
お返事をするのが遅くなり、大変失礼いたしました。
また、様々な方法をご教授いただきまして大変感謝いたします。

yu_sas 様のおっしゃる通り、同じ値を持つ 2 つの変数を識別することを目的としておりました。
教えていただいたコードを使用して比較したいと思います。

ありがとうございました。