我有一个看起来像的数据集:
邮政编码总车
Ther就像这样300万+行,拉链不同。我需要为每个邮政编码总计汽车总数,以便生成的表格看起来像
邮政编码总车
考虑到数据集的大小,手动将拉链输入代码不是一种选择。想法?
答案 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)
/ <强> *代码强> /
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
;
退出;