计算列百分比 sas
Calculate Column Percentage sas
我有以下数据集:
Date Occupation Tota_Employed
1/1/2005 Teacher 45
1/1/2005 Economist 76
1/1/2005 Artist 14
2/1/2005 Doctor 26
2/1/2005 Economist 14
2/1/2005 Mathematician 10
and so on until November 2014
我想做的是计算职业就业百分比列,这样我的数据将如下所示:
Date Occupation Tota_Employed Percent_Emp_by_Occupation
1/1/2005 Teacher 45 33.33
1/1/2005 Economist 76 56.29
1/1/2005 Artist 14 10.37
2/1/2005 Doctor 26 52.00
2/1/2005 Economist 14 28.00
2/1/2005 Mathematician 10 20.00
其中percent_emp_by_occupation的计算方法是将total_employed除以每个日期(月&年)除以每个职业的总和得到百分比:
教师示例:(45/135)*100,其中 135 是 45+76+14 的总和
我知道我可以通过 proc tabulate 得到一个 table,但我想知道是否有通过另一个程序得到它的方法,特别是因为我想把它作为一个单独的数据集。
执行此操作的最佳方法是什么?提前致谢。
答案是回顾过去几天您就同一数据提出的问题并研究这些答案。你的答案就在那里。
当您查看这些答案时,花点时间感谢他们并给帮助您的人一张支票。
从日期中提取月份和年份并创建一个键:
data ds;
set ds;
month=month(date);
year=year(date);
key=catx("_",month,year);
run;
累计月度总数:
Proc sql;
create table month_total as
select key,sum(total_employed) as monthly_total
from ds
group by key;
quit;
用每月总计更新原始数据:
Proc sql;
create table ds as
select a.*,b.monthly_total
from ds as a left join month_total as b
on a.key=b.key;
quit;
这将导致以下数据集:
日期职业Tota_Employedmonthly_total
2005 年 1 月 1 日 教师 45 135
1/1/2005 经济学家 76 135
1/1/2005 艺术家 14 135
最终计算百分比为:
data ds;
set ds;
percentage=total_employed/monthly_total;
run;
给你:
proc sql;
create table occ2 as
select
occ.*,
total_employed/employed_by_date as percentage_employed_by_date format=percent7.1
from
occ a
join
(select
date,
sum(total_employed) as employed_by_date
from occ
group by date) b
on
a.date = b.date
;
quit;
产生一个 table 像这样:
最后一个想法:您可以在一次数据传递中创建此计算所需的所有总计。我查看了您之前提出的有关此数据的问题,并假设您使用 proc means
按日期和职业汇总了您的初始数据。您也可以在相同的过程中按日期计算总计。我没有你的数据,所以我将用每个 SAS 安装附带的 sashelp.class 数据集来说明这个概念。
在这个例子中,我想得到按性别和年龄分类的学生总数,但我还想按性别得到学生总数,因为我稍后会计算按性别分类的学生百分比。下面介绍如何汇总数据并获取 2 个不同级别汇总的计数。
proc summary data=sashelp.class;
class sex age;
types sex sex*age;
var height;
output out=summary (drop=_freq_) n=count;
run;
types
语句标识了我的 class 变量的摘要级别。在这种情况下,我想要只统计性别,以及按年龄统计性别。输出结果如下。
_TYPE_
变量标识摘要级别。性别总数为 _TYPE_=2
,而按年龄划分的性别总数为 _TYPE_=3
。
然后一个简单的SQL查询来计算性别中的百分比。
proc sql;
create table summary2 as
select
a.sex,
a.age,
a.count,
a.count/b.count as percent_of_sex format=percent7.1
from
summary (where=(_type_=3)) a /* sex * age */
join
summary (where=(_type_=2)) b /* sex */
on
a.sex = b.sex
;
quit;
我有以下数据集:
Date Occupation Tota_Employed
1/1/2005 Teacher 45
1/1/2005 Economist 76
1/1/2005 Artist 14
2/1/2005 Doctor 26
2/1/2005 Economist 14
2/1/2005 Mathematician 10
and so on until November 2014
我想做的是计算职业就业百分比列,这样我的数据将如下所示:
Date Occupation Tota_Employed Percent_Emp_by_Occupation
1/1/2005 Teacher 45 33.33
1/1/2005 Economist 76 56.29
1/1/2005 Artist 14 10.37
2/1/2005 Doctor 26 52.00
2/1/2005 Economist 14 28.00
2/1/2005 Mathematician 10 20.00
其中percent_emp_by_occupation的计算方法是将total_employed除以每个日期(月&年)除以每个职业的总和得到百分比:
教师示例:(45/135)*100,其中 135 是 45+76+14 的总和
我知道我可以通过 proc tabulate 得到一个 table,但我想知道是否有通过另一个程序得到它的方法,特别是因为我想把它作为一个单独的数据集。
执行此操作的最佳方法是什么?提前致谢。
答案是回顾过去几天您就同一数据提出的问题并研究这些答案。你的答案就在那里。
当您查看这些答案时,花点时间感谢他们并给帮助您的人一张支票。
从日期中提取月份和年份并创建一个键:
data ds;
set ds;
month=month(date);
year=year(date);
key=catx("_",month,year);
run;
累计月度总数:
Proc sql;
create table month_total as
select key,sum(total_employed) as monthly_total
from ds
group by key;
quit;
用每月总计更新原始数据:
Proc sql;
create table ds as
select a.*,b.monthly_total
from ds as a left join month_total as b
on a.key=b.key;
quit;
这将导致以下数据集:
日期职业Tota_Employedmonthly_total 2005 年 1 月 1 日 教师 45 135 1/1/2005 经济学家 76 135 1/1/2005 艺术家 14 135
最终计算百分比为:
data ds;
set ds;
percentage=total_employed/monthly_total;
run;
给你:
proc sql;
create table occ2 as
select
occ.*,
total_employed/employed_by_date as percentage_employed_by_date format=percent7.1
from
occ a
join
(select
date,
sum(total_employed) as employed_by_date
from occ
group by date) b
on
a.date = b.date
;
quit;
产生一个 table 像这样:
最后一个想法:您可以在一次数据传递中创建此计算所需的所有总计。我查看了您之前提出的有关此数据的问题,并假设您使用 proc means
按日期和职业汇总了您的初始数据。您也可以在相同的过程中按日期计算总计。我没有你的数据,所以我将用每个 SAS 安装附带的 sashelp.class 数据集来说明这个概念。
在这个例子中,我想得到按性别和年龄分类的学生总数,但我还想按性别得到学生总数,因为我稍后会计算按性别分类的学生百分比。下面介绍如何汇总数据并获取 2 个不同级别汇总的计数。
proc summary data=sashelp.class;
class sex age;
types sex sex*age;
var height;
output out=summary (drop=_freq_) n=count;
run;
types
语句标识了我的 class 变量的摘要级别。在这种情况下,我想要只统计性别,以及按年龄统计性别。输出结果如下。
_TYPE_
变量标识摘要级别。性别总数为 _TYPE_=2
,而按年龄划分的性别总数为 _TYPE_=3
。
然后一个简单的SQL查询来计算性别中的百分比。
proc sql;
create table summary2 as
select
a.sex,
a.age,
a.count,
a.count/b.count as percent_of_sex format=percent7.1
from
summary (where=(_type_=3)) a /* sex * age */
join
summary (where=(_type_=2)) b /* sex */
on
a.sex = b.sex
;
quit;