1

我一直在努力让我的代码更高效,这是原始代码,但我认为它可以一步编写。

data TABLE;set ORIGINAL_DATA;
Multi=percent*total_units;
keep Multi Type;
proc sort; by Type;
proc means noprint data=TABLE1; by Type; var Multi;output out=Table2(drop= _type_ _freq_)sum=Multi;run;
proc means noprint data=Table1;  var Multi;output out=Table3(drop= _type_ _freq_) sum=total ;run;

proc sql;
    create table TABLE4as 
    select a.Type, a.Multi label="Multi", b.total label="total"
    from TABLE2 a, TABLE3 b
    order by Type;
quit;

data TABLE5;set TABLE4;
pct=(MULTI/total)*100;
run;

我可以拆分其中的一部分,但我不知道如何在我的代码中获取 PCT 部分。这就是我所拥有的。

proc sql;
create table TABLE1 as
select distinct type, sum(percent*total_units) as MULTI label "MULTI", 
    MULTI/(percent*total_units)) as PCT
from ORIGINAL_DATA
group by type;
quit;

我不得不编辑一些代码,但我认为总体思路应该是有意义的。主要问题是我无法调用 MULTI 列,因为它刚刚被创建,但我想为每种类型创建一个总数的百分比。

4

3 回答 3

4

执行此类操作的“SAS”方法是使用CLASS带有PROC MEANS. 这将计算数据中所有交互级别的统计数据(由TYPE变量标识)。TYPE = 0的行将是“总”值,表示整个数据集的该统计数据的值。

在您的情况下,我们可以利用将创建按TYPE和语句中列出的变量PROC MEANS排序的输出数据集的事实。这意味着我们可以只读取第一个观察值并保存它的值以计算百分比。CLASS

只显示一些代码可能更容易:

data TABLE;
   set ORIGINAL_DATA;
   Multi = percent * total_units;
   keep Multi Type;
run;

proc means noprint data=TABLE;
   class Type;
   var multi;
   output out=next sum=;
run;

data want;
   retain total;
   set next;
   if _n_ = 1 then do;
      /* The first obs will be the _TYPE_=0 record */
      total = multi;
      delete;
      end;
   pct = (multi / total) * 100;
   drop total _freq_ _type_;
run;

请注意,您不需要在使用之前对数据进行排序PROC MEANS。那是因为我们使用的是CLASS语句而不是BY语句。数据步骤使用由MEANSTYPE = 0 记录)创建的数据集中的第一个观察值来保留变量的总和。该delete声明将其排除在结果之外。

CLASS语句PROC MEANS非常有用。花几分钟时间了解如何计算TYPE变量,尤其是在您尝试使用多个类变量时。

于 2013-06-26T23:42:51.527 回答
3

您可以使用 PROC MEANS 的 VAR 语句中的 WEIGHT 选项跳过初始数据步骤(这将有效地为您执行乘法)。您也可以使用 PROC TABULATE 代替 PROC MEANS,因为制表可以计算百分比。我相信以下代码将一次性产生您所需的输出。

ods noresults;
proc tabulate data=have out=want (drop=_: rename=(total_units_sum=total total_units_pctsum_0=pct));
class type;
var total_units / weight=percent;
table type, total_units*(sum pctsum);
run;
ods results;  
于 2013-06-27T09:02:52.280 回答
1

如果您需要一步,也许这会起作用,但实际上效率不高,因为它处理数据两次,一次按类型处理详细信息,一次处理总计。

proc sql;
create table TABLE1 as
select 
d.type
, sum(d.percent*d.total_units) as MULTI label "MULTI"
, calculated MULTI/s.total as PCT
from ORIGINAL_DATA d,
 ( select sum(percent*total_units) as total 
from ORIGINAL_DATA) s
group by type
;
quit;

为了提高效率,但在多个步骤中,您可以简单地将表替换为原始代码中的视图:

data TABLE;=>data TABLE / view=TABLE;

create table TABLE4=>create view TABLE4

于 2013-06-27T11:52:29.577 回答