如何在sas中为唯一变量创建索引?

时间:2012-10-14 23:20:29

标签: variables indexing unique sas

我试图将两种模型输出的优势比与SAS中的不同调整结合起来:

即:

ods output oddsratios=adjustedOR1(rename=(OddsRatioEst=OR1);
 proc logistic data=dataname; 
      model y= b d c a e; run;

ods output oddsratios=adjustedOR2 (rename=(OddsRatioEst=OR2);
 proc logistic data=dataname; 
      model y= b d c; run;

proc sort .....

data Oddsratios (keep=Effect OR1 OR2);
merge adjustedOR1 adjustedOR2; by effect; run;

问题是如果我按效果变量排序和合并,我就会失去将解释变量放入模型的顺序。

无论如何根据我在模型中放置的顺序为变量分配索引,以便最终表格的顺序包含效果列:b d c a e?

感谢您的帮助

4 个答案:

答案 0 :(得分:1)

我认为对数据进行排序的最简单方法是在Proc Sql中进行合并,并在'order by'子句中使用case语句。这是一个例子。

ods output oddsratios=adjustedOR1(rename=(OddsRatioEst=OR1));
 proc logistic data=sashelp.class; 
      model sex= height age weight; run;

ods output oddsratios=adjustedOR2 (rename=(OddsRatioEst=OR2));
 proc logistic data=sashelp.class; 
      model sex= height age; run;

proc sql;
create table Oddsratios as select
a.effect,
a.or1,
b.or2
from    adjustedOR1 as a 
            left join
        adjustedOR2 as b
            on a.effect=b.effect
order by 
    case a.effect
        when 'Height' then 1
        when 'Age' then 2
        when 'Weight' then 3
    end;
quit;

答案 1 :(得分:1)

我建议使用您想要的排序顺序在“主”数据集中创建一个新的序列变量。然后用该变量重新排序合并后的结果:

data adjustedOR1;
   set adjustedOR1;
   sortkey = _n_;
run;
proc sort data=adjustedOR1;
   by effect;
run;
proc sort data=adjustedOR2;
   by effect;
run;
data Oddsratios (keep=Effect OR1 OR2 sortkey);
   merge adjustedOR1 adjustedOR2; 
      by effect;
run;
proc sort data=Oddsratios;
  by sortkey;
run;

这比排序序列的硬编码更通用,因为Keith建议使用PROC SQL(顺便说一下也是如此)。

感谢基思提供了一个实际的例子!

答案 2 :(得分:0)

如果您只想更改变量在数据集中的显示顺序,可以使用retain语句:

data Oddsratios (keep=Effect OR1 OR2);
 retain b d c a e;
 merge adjustedOR1 adjustedOR2; 
 by effect; 
run;

这不是保留的目的,但它有效。

但我想知道为什么你关心数据集中变量的顺序是什么。例如,您可以在使用proc print显示结果时指定顺序。

答案 3 :(得分:0)

最简单的答案我认为仍然相当灵活的是从原始数据集创建信息。然后在合并期间,您可以使用数字顺序变量创建一个新变量,然后按此排序。

另一种解决方案是以不需要排序的方式进行合并 - 例如,创建哈希表,或者从优势比2数据集中创建格式,并将其附加到简单的数据步骤而不是通过合并。

data have;
input effect $;
datalines;
b
d
c
a
e
;;;;
run;

data for_format;
set have;
fmtname='EFF';
type='j';
hlo='s';
start=effect;
label=_n_;
keep hlo type fmtname start label;
run;

proc format cntlin=for_format;
quit;

proc sort data=have;
by effect;
run;

data want;
set have; *your merge here instead;
by effect;
eff_order=input(effect,$EFF.);
run;

proc sort data=want;
by eff_order;
run;
proc print data=want;
run;