Graph 在SAS中使用SGplot对箱线图进行排序

Graph 在SAS中使用SGplot对箱线图进行排序,graph,sas,boxplot,Graph,Sas,Boxplot,我使用SGPLOT过程在SAS中生成垂直箱线图,下面是代码。我不能按各种类别对箱线图进行排序,我想通过测量“胆固醇”的变量的升序平均值对它们进行排序,但似乎无法做到这一点。此外,我希望能够改变不同级别的类别变量的名称“WeithItHyb”,甚至可以考虑按字母顺序排序的方框图。< /P> proc sgplot data=sashelp.heart; title "Cholesterol Distribution by Weight Class"; vbox cholesterol / cate

我使用SGPLOT过程在SAS中生成垂直箱线图,下面是代码。我不能按各种类别对箱线图进行排序,我想通过测量“胆固醇”的变量的升序平均值对它们进行排序,但似乎无法做到这一点。此外,我希望能够改变不同级别的类别变量的名称“WeithItHyb”,甚至可以考虑按字母顺序排序的方框图。< /P>
proc sgplot data=sashelp.heart;
title "Cholesterol Distribution by Weight Class";
vbox cholesterol / category=weight_status GROUPORDER= descending;
run;
title
有人能帮忙吗?

纠正您的错误 要使用
GROUPORDER=
,您必须使用
GROUP=
而不是类别,因此:

title "Cholesterol Distribution by Weight Status";
proc sgplot data=sashelp.heart;
    where Weight_Status NE '';
    vbox cholesterol / 
        GROUP=weight_status  
        GROUPORDER= descending;
run;
title
我不得不添加where子句,因为缺少的类别会被抑制,而缺少的组则不会

按被测变量的平均值排序 为此,必须将该平均值添加到数据集中,例如:

proc sql;
    create view temp_heart as
    select individu.weight_status, cholesterol, group_mean
    from   sashelp.heart individu inner join
        (   select weight_status, mean(cholesterol) as group_mean
            from   sashelp.heart
            group by weight_status ) collection 
        on individu.weight_status EQ collection.weight_status;
quit;
我有两种方法让你展示这个

使用平均胆固醇作为类别,使用体重状态作为组 数字类别是按数字顺序排序的,因此这就完成了工作,但为了在图例中显示您的权重类别,我使用它们作为组

proc sgplot data=temp_heart;
    where Weight_Status NE '';
    vbox cholesterol / 
        Category=group_mean
        GROUP=weight_status  ;
run;
我同意,这是又快又脏的,所以我有另一个选择

使用“平均胆固醇”作为类别,但要在其上设置格式 使用
Proc Format
创建平均值格式,然后使用该格式

proc sql;
    create table temp_means as 
    select 'mean2status' as fmtname
         , mean(cholesterol) - 1E-8 as start
         , mean(cholesterol) + 1E-8 as end
         , weight_status as label
    from   sashelp.heart
    group by weight_status;
quit;

proc format cntlin=temp_means (where=(label NE '')) cntlout=temp_check;
run;

proc sgplot data=temp_heart (where=(weight_status NE ''));
    format group_mean mean2status.;
    vbox cholesterol / 
        category=group_mean;
run;

不幸的是,我必须在平均值周围使用2E-8的间隔,然后才能工作。

您应该提供一个样本
temp
数据集,或者重写它来处理
sashelp
数据集(
sashelp.class
sashelp.cars
,等等)。当然,Joe-我对代码进行了更改,使其能够处理sashelp数据集。我需要能够通过平均值(升序)显示结果的3个箱线图。此外,我希望能够更改各种类别值的“显示”名称,例如,正常值为N,超重值为O,体重不足值为U,而无需在数据集中实际更改。谢谢Dirk。您的过程sql代码中的“individu”是什么?我在任何地方都找不到该名称的变量/数据集。在创建视图时,我也无法选择更多变量-我收到一个错误。甚至不能在括号内的select语句中将其子集
individu
collection
都是sashelp.heart和子查询的别名