如何计算SAS中频率表的分位数数据?

如何计算SAS中频率表的分位数数据?,sas,frequency,quantile,Sas,Frequency,Quantile,我很想把我的数据分成三份,但我只有一份按州划分的统计汇总表。具体地说,我已经估计了各州的入学人数,我想计算哪些州占所有入学人数的前三分之一。所以,前三分之一应该至少包括.33333的总累积百分比 我尝试了各种方法来指定.33333和.40000之间的累积百分比,但没有成功地指定一般情况PROC RANK也无法使用,因为数据被组织为频率表 我在下面包含了一些虚拟(但具有代表性)数据 根据cum_percent的值,占入学人数前三分之一的州是:加利福尼亚州、德克萨斯州、纽约州、佛罗里达州和伊利诺

我很想把我的数据分成三份,但我只有一份按州划分的统计汇总表。具体地说,我已经估计了各州的入学人数,我想计算哪些州占所有入学人数的前三分之一。所以,前三分之一应该至少包括.33333的总累积百分比

我尝试了各种方法来指定.33333和.40000之间的累积百分比,但没有成功地指定一般情况<代码>PROC RANK也无法使用,因为数据被组织为频率表

我在下面包含了一些虚拟(但具有代表性)数据



根据
cum_percent
的值,占入学人数前三分之一的州是:加利福尼亚州、德克萨斯州、纽约州、佛罗里达州和伊利诺伊州

有没有办法通过编程来实现这一点?我最终想指定一个用于选择状态的标志变量


谢谢…

看来你已经完成了90%的工作。如果您只需要一种方法将cum_%放入标记的桶中,那么设置格式非常简单

proc format;
    value pctile
    low-0.33333 = 'top third'
    0.33333<-.4 = 'next bit'
    0.4<-high = 'the rest'
    ;
run;
options fmtsearch=(work);

按照以下方式重写上一个数据步骤:

data dummy_4(drop=found); 
set dummy_3;
retain cum_percent 0 found 0;
cum_percent + percent_total;
if cum_percent < (1/3) then do;
    top_third = 1;
end;
else if ^found then do; 
    top_third = 1;
    found =1;
end;
else
    top_third = 0;
run;
数据伪4(drop=found);
设置虚拟_3;
保留百分比0,发现0;
累计百分比+总百分比;
如果cum_百分比<(1/3),则执行该操作;
上三分之一=1;
结束;
否则,如果发现,则执行;
上三分之一=1;
发现=1;
结束;
其他的
上三分之一=0;
跑
注意:您的
第一个。
语法不正确<代码>第一个。和
最后一个
。只能分组工作。您可以通过
CUM_PERCENT+PERCENT_total获得正确的CUM_PERCENT值语句


我不知道有哪个PROC可以为您这样做。

您可以使用PROC FREQ with WEIGHT语句轻松计算百分比,然后使用LAG函数选择前三个百分比:

proc freq data=state_counts noprint order=data;
   tables state / out=state_counts2;
   weight enrollment;
run;

data top3rd;
   set state_counts2;
   cum_percent+percent;
   if lag(cum_percent)<100/3 then top_third=1;
run;
proc freq data=state\u counts noprint order=data;
表state/out=state\u counts2;
体重登记;
跑
数据排名第三;
设置状态_计数2;
cum_百分比+百分比;

如果落后(cum_%的话),你不会失去伊利诺伊州作为前三名的成员吗?它的累积百分比>0.3333,但仍然排在前三位,因为前一个州(佛罗里达州)有cum_percent我看到
保留
第一个。
用于为整个数据集指定计数器。。。在这方面,您是否发现有任何文档对您有所帮助?试试这个。
data dummy_4(drop=found); 
set dummy_3;
retain cum_percent 0 found 0;
cum_percent + percent_total;
if cum_percent < (1/3) then do;
    top_third = 1;
end;
else if ^found then do; 
    top_third = 1;
    found =1;
end;
else
    top_third = 0;
run;
proc freq data=state_counts noprint order=data;
   tables state / out=state_counts2;
   weight enrollment;
run;

data top3rd;
   set state_counts2;
   cum_percent+percent;
   if lag(cum_percent)<100/3 then top_third=1;
run;