1

我有兴趣将我的数据分成三份,但我只有一个按州统计的汇总表。具体来说,我估计了各州的入学人数,我想计算哪些州占所有入学人数的前三分之一。因此,前三分之一应至少包含 0.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,占入学率前三分之一的州是:加利福尼亚州、德克萨斯州、纽约州、佛罗里达州和伊利诺伊州。

有没有办法以编程方式做到这一点?我最终想指定一个标志变量来选择状态。

谢谢...

4

3 回答 3

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);

并在数据步的末尾添加一条语句:

pctile_flag = put(cum_percent,pctile.);
于 2013-12-30T20:31:33.540 回答
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;
于 2013-12-30T22:03:02.397 回答
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。

于 2013-12-30T20:48:30.013 回答