我有兴趣将我的数据划分为三分之一,但我只有一个州的计数汇总表。具体来说,我估计了州的入学人数,我想计算哪些州占所有入学人数的前三分之一。所以,前三分之一应该包括至少总累计百分比为.33333 ......
我尝试过各种方法来指定.33333和.40000之间的累积百分比,但没有成功指定一般情况。 PROC RANK
也无法使用,因为数据被组织为频率表......
我在下面列出了一些虚拟(但具有代表性)的数据。
data state_counts;
input state $20. enrollment;
cards;
CALIFORNIA 440233
TEXAS 318921
NEW YORK 224867
FLORIDA 181517
ILLINOIS 162664
PENNSYLVANIA 155958
OHIO 141083
MICHIGAN 124051
NEW JERSEY 117131
GEORGIA 104351
NORTH CAROLINA 102466
VIRGINIA 93154
MASSACHUSETTS 80688
INDIANA 75784
WASHINGTON 73764
MISSOURI 73083
MARYLAND 73029
WISCONSIN 72443
TENNESSEE 71702
ARIZONA 69662
MINNESOTA 66470
COLORADO 58274
ALABAMA 54453
LOUISIANA 50344
KENTUCKY 49595
CONNECTICUT 47113
SOUTH CAROLINA 46155
OKLAHOMA 43428
OREGON 42039
IOWA 38229
UTAH 36476
KANSAS 36469
MISSISSIPPI 33085
ARKANSAS 32533
NEVADA 27545
NEBRASKA 24571
NEW MEXICO 22485
WEST VIRGINIA 21149
IDAHO 20596
NEW HAMPSHIRE 19121
MAINE 18213
HAWAII 16304
RHODE ISLAND 13802
DELAWARE 12025
MONTANA 11661
SOUTH DAKOTA 11111
VERMONT 10082
ALASKA 9770
NORTH DAKOTA 9614
WYOMING 7457
DIST OF COLUMBIA 6487
;
run;
***** calculating the cumulative frequencies by hand ;
proc sql;
create table dummy_3 as
select
state,
enrollment,
sum(enrollment) as total_enroll,
enrollment / calculated total_enroll as percent_total
from state_counts
order by percent_total desc ;
quit;
data dummy_4; set dummy_3;
if first.percent_total then cum_percent = 0;
cum_percent + percent_total;
run;
根据cum_percent
的值,构成登记前三分之一的州是:加利福尼亚州,德克萨斯州,纽约州,佛罗里达州和伊利诺伊州。
有没有办法以编程方式执行此操作?我最终想指定一个用于选择状态的标志变量。
...谢谢
答案 0 :(得分:1)
好像你有90%的路在那里。如果你只是需要一种方法将cum_percent放入标记的桶中,那么设置格式非常简单。
proc format;
value pctile
low-0.33333 = 'top third'
0.33333<-.4 = 'next bit'
0.4<-high = 'the rest'
;
run;
options fmtsearch=(work);
在datastep的末尾添加一条语句:
pctile_flag = put(cum_percent,pctile.);
答案 1 :(得分:1)
重写您的上一个数据步骤:
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;
注意:您的first.
语法不正确。 first.
和last
。仅适用于BY组。您可以通过cum_percent + percent_total;
语句在CUM_PERCENT中获得正确的值。
我不知道PROC会为你做这件事。
答案 2 :(得分:1)
您可以使用带有WEIGHT语句的PROC FREQ轻松计算百分比,然后使用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;