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

Variables 如何为sas中的唯一变量创建索引?,variables,indexing,unique,sas,Variables,Indexing,Unique,Sas,我试图将两个模型输出的优势比与SAS中的不同调整结合起来: i、 e: 进程排序 data Oddsratios (keep=Effect OR1 OR2); merge adjustedOR1 adjustedOR2; by effect; run; 问题是,如果我按照效果变量进行排序和合并,我就失去了在模型中放置解释变量的顺序 是否有必要根据我在模型中的顺序为变量分配一个索引,这样最终的表将具有顺序为b d c a e的效果列 感谢您的帮助如果您只想更改变量在数据集中的显示顺序,可以使用r

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

i、 e:

进程排序

data Oddsratios (keep=Effect OR1 OR2);
merge adjustedOR1 adjustedOR2; by effect; run;
问题是,如果我按照效果变量进行排序和合并,我就失去了在模型中放置解释变量的顺序

是否有必要根据我在模型中的顺序为变量分配一个索引,这样最终的表将具有顺序为b d c a e的效果列


感谢您的帮助

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

data Oddsratios (keep=Effect OR1 OR2);
 retain b d c a e;
 merge adjustedOR1 adjustedOR2; 
 by effect; 
run;
这并不是retain的真正目的,但它很有效


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

我认为对数据排序的最简单方法是在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;

我建议在“主”数据集中创建一个具有所需排序顺序的新序列变量。然后按该变量对合并结果重新排序:

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建议使用ProcSQL(顺便说一句,ProcSQL也可以使用)硬编码排序序列要通用一些


感谢Keith提供了一个实际的例子

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

另一种解决方案是以一种不需要排序的方式进行合并——例如,创建一个哈希表,或者使用优势比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;

b、 d、c、a、e是变量“Effect”的值,而不是单独的变量名。我相信这个问题与特定变量的自定义排序有关。好的答案鲍勃,我想它可以归结为有多少影响变量,以及在以后的步骤中使用数据。我总是喜欢看数据,而不是在脑海中想象数据,因此举个例子。(另外,我知道我提出的解决方案行之有效!)谢谢鲍勃和基思!我最终使用了Bobs示例,因为它是最快的,并且因为我混合了连续变量和分类变量。但是Keiths one可以修改我正在编写的宏。再次感谢!
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;