我正在使用SGPLOT过程在SAS中生成垂直箱图,以下是代码。我不能按不同的类别对箱线图进行排序,我想按被测量变量“胆固醇”的升序平均值对它们进行排序,但似乎无法做到这一点。此外,我希望能够更改不同级别的类别变量"weight_status“的名称,甚至可以考虑按字母顺序绘制箱形图。
proc sgplot data=sashelp.heart;
title "Cholesterol Distribution by Weight Class";
vbox cholesterol / category=weight_status GROUPORDER= descending;
run;
title有人能帮个忙吗?
发布于 2015-07-31 14:55:35
纠正你的错误
要使用GROUPORDER=,您必须使用GROUP=而不是categories,因此这是可行的:
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;我有两种方法可供您显示
使用平均胆固醇作为类别,使用weight_status作为组
数字类别是按数字顺序排序的,所以这样做是为了在图例中显示您的权重类别,我将它们用作组
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的间隔。
https://stackoverflow.com/questions/31733862
复制相似问题