SAS循环:根据条件垂直对观测值求和

时间:2014-12-03 05:56:59

标签: loops sas

我有一个看起来像的数据集:

邮政编码总车

  • 11111 3
  • 11111 4
  • 23232 1
  • 44331 0
  • 44331 10
  • 18860 6
  • 18860 6
  • 18860 6
  • 18860 8

Ther就像这样300万+行,拉链不同。我需要为每个邮政编码总计汽车总数,以便生成的表格看起来像

邮政编码总车

  • 11111 7
  • 23232 1
  • 44331 10
  • 18860 26 。 。

考虑到数据集的大小,手动将拉链输入代码不是一种选择。想法?

4 个答案:

答案 0 :(得分:3)

到目前为止,这两个答案都没问题,但这里有两种可能方法的更详细解释:

PROC SQL METHOD

PROC SQL;
  CREATE TABLE output_table AS
  SELECT ZipCodes,
  SUM(Total_Cars) as Total_Cars
  FROM input_table
  GROUP BY ZipCodes;
QUIT;

GROUP BY子句也可以写成GROUP BY 1,省略ZipCodes,因为它引用SELECT子句中的第1列。

PROC SUMMARY METHOD

PROC SUMMARY DATA=input_table NWAY;
             CLASS ZipCodes;
             VAR Total_Cars;
             OUTPUT OUT=output_table (DROP=_TYPE_ _FREQ_) SUM()=;
RUN;

该方法类似于此问题的另一个答案,但我已添加:

  • NWAY - 仅提供最高级别的摘要,此处它并不重要,因为您只有一个CLASS变量,这意味着只有一个级别的摘要。但是,如果没有NWAY,您会得到一个额外的行,显示整个数据集中Total_Cars的总值,这不是您在问题中要求的内容。

  • DROP=_TYPE_ _FREQ_ - 这会删除自动变量:

    • _TYPE_ - 显示摘要级别(请参阅上面的评论),它只是一个包含值1的列。
    • _FREQ_ - 提供ZipCodes的频率计数,虽然它很有用,但在您的问题中并不是您想要的。

数据步骤方法

PROC SORT DATA=input_table (RENAME=(Total_Cars = tc)) OUT=_temp;
  BY ZipCodes;
RUN;

DATA output_table (DROP=TC);
  SET _temp;
  BY ZipCodes;
  IF first.ZipCodes THEN Total_Cars = 0;
  Total_Cars+tc;
  IF last.ZipCodes THEN OUTPUT;
RUN;

这仅仅是为了完整性而包含的,它不像预先排序那样高效。

答案 1 :(得分:1)

补充@ mjsqu的答案,以获得(更多)完整性:

data testin;
    input Zip Cars;
    datalines;
11111 3
11111 4
23232 1
44331 0
44331 10
18860 6
18860 6
18860 6
18860 8
;

PROC TABULATE METHOD

proc tabulate data=testin out=testout

    /*drop extra created vars and rename as needed*/
    (drop=_type_ _page_ _table_ rename=(Zip='Zip Codes'n Cars_Sum='Total Cars'n));

    /*grouping variable, also used to sort output in ascending order*/
    class Zip;

    /* variable to be analyzed*/
    var Cars;

    /*sum cars by zip code*/
    table Zip, Cars*(sum);
run;

如果使用Enterprise Guide,则会生成数据集和结果表。要取消结果并仅输出数据集,请在“proc tabulate”之前包含此行:

ods select none; /*suppress ods output*/

并且在“跑”之后:

ods select all; /*restore ods output*/

答案 2 :(得分:0)

  1. 您想要求和的变量是“ZipCodes”,因此将进入“Class”部分。
  2. 您想要总计Total_cars,以便进入“var”部分。
  3. Input_table和Output_table是不言自明的。
  4. / <强> *代码 /

       proc summary data=Input_table;
                   class ZipCodes;
                   var Total_cars;
            output out=Output_table
            sum()=;
            run;
    

答案 3 :(得分:0)

您可以使用proc sql。这是一个非常简单的步骤

proc sql;

create table new as

select Zipcodes, sum(Total Cars) as total_cars from table_have group by Zipcodes

;

退出;