【问题标题】:Calculate Column Percentage sas计算列百分比 sas
【发布时间】:2016-01-20 03:50:00
【问题描述】:

我有以下数据集:

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 获得一个表格,但我想知道是否可以通过另一个过程获得它,特别是因为我希望将它作为一个单独的数据集。

执行此操作的最佳方法是什么?提前致谢。

【问题讨论】:

    标签: sas percentage


    【解决方案1】:

    从日期中提取月份和年份并创建密钥:

    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;
    

    这将导致以下数据集:

    日期职业总计_就业每月_总计 2005 年 1 月 1 日 教师 45 135 2005 年 1 月 1 日经济学家 76 135 1/1/2005 艺术家 14 135

    最后计算百分比为:

    data ds;
    set ds;
    percentage=total_employed/monthly_total;
    run;
    

    【讨论】:

    • 非常感谢 Nirvik。我的思路完全一样,不幸的是我一点也不擅长 SQL。我想知道这是否也可以在没有 Proc sql 的情况下完成。我认为 first.variable 和 last.variable 可以以某种方式使用,但我无法理解它。
    【解决方案2】:

    给你:

    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;
    

    生成一个像这样的表:

    最后一个想法:您可以在一次数据传递中创建此计算所需的所有总计。我查看了您之前询问过的有关此数据的问题,并假设您使用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 语句标识了我的类变量的汇总级别。在这种情况下,我想要只计算性别,以及按年龄计算的性别。这是输出的样子。

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

    【讨论】:

    • 谢谢。非常感谢!
    【解决方案3】:

    答案是回顾您在过去几天就相同数据提出的问题并研究这些答案。你的答案就在那里。

    在您查看这些答案时,请花时间感谢他们,并为帮助您的人提供支票。

    【讨论】:

    • 我确实仔细阅读了答案,但这对我想做的事情没有帮助。还是谢谢。
    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2022-06-23
    相关资源
    最近更新 更多