【问题标题】:SAS : Summarise the dataSAS:汇总数据
【发布时间】:2016-02-02 11:08:21
【问题描述】:

我有一个给定的数据集:

Policy_Number,var1,var2,var3,Exposure
1,B,H,J,191
2,B,F,Unknown,174
3,C,Unknown,I,153
4,B,G,L,192
5,Unknown,E,Unknown,184
6,D,E,K,113
7,C,Unknown,I,140
8,A,H,I,133
9,C,F,I,194
10,Unknown,G,Unknown,105
11,B,H,L,172
12,A,Unknown,I,198
13,D,E,K,155
14,Unknown,G,K,177
15,B,H,Unknown,100
16,D,Unknown,J,176
17,B,E,I,112
18,Unknown,E,J,192
19,C,Unknown,K,146
20,C,G,Unknown,187

我想使用 PROC Means 或 Summary 将给定的数据转换为以下形式:

Variables   Levels   Tot_Exposures
  Var1        A           331
  Var1        B           941
  Var1        C           ...
  Var1        D           ...
  Var1     Unknown        ...   
  Var2        E           ...
  Var2        F           ...
  Var2        G           ...
  Var2        H           ...
  Var2     Unknown        ...   
  Var3        I           ...
  Var3        J           ...
  Var3        K           ...
  Var3        L           ...
  Var3     Unknown        ...

Tot_Exposure 返回我想要这个汇总表的每个变量名的总曝光量。请帮帮我。

编辑:我已经尝试过 proc 方法,但我希望它一步执行。我分三步完成。并得到像图像一样的输出。

代码如下:

data try2;
infile 'complex.csv' dsd dlm = ',' FIRSTOBS = 2;
Length Policy_Number Var1 $ 10 Var2 $ 10 Var3 $ 10 Exposure 3;
input Policy_Number $ Var1 $ Var2 $ Var3 $ Exposure;
run;
proc sort data = try2;
by Exposure;
run;
proc means data = try2 SUM;
class Var1;
var exposure;
output out = want;
title ' Var1';
run;
proc means data = try2 SUM;
class Var2;
var exposure;
output out = want2;
title 'Var2';
run;
proc means data = try2 SUM;
class Var3;
var exposure;
output out = want3;
title 'Var3';
run;

【问题讨论】:

    标签: csv sas


    【解决方案1】:

    您可以在一个 PROC Summary 步骤中汇总所有三个变量,但输出与您指定的不完全相同。但这可以通过对 PROC Summary 输出的数据步骤操作来实现。我在 CLASS 语句中使用 MLF 选项将所有 CLASS 变量“转换”为字符。你没有,但它很有用,因为类变量可以是数字字符。

    data exp;
       infile cards dsd firstobs=2;
       input Policy_Number (var1-var3) ($) Exposure;
       cards;
    Policy_Number,var1,var2,var3,Exposure
    1,B,H,J,191
    2,B,F,Unknown,174
    3,C,Unknown,I,153
    4,B,G,L,192
    5,Unknown,E,Unknown,184
    6,D,E,K,113
    7,C,Unknown,I,140
    8,A,H,I,133
    9,C,F,I,194
    10,Unknown,G,Unknown,105
    11,B,H,L,172
    12,A,Unknown,I,198
    13,D,E,K,155
    14,Unknown,G,K,177
    15,B,H,Unknown,100
    16,D,Unknown,J,176
    17,B,E,I,112
    18,Unknown,E,J,192
    19,C,Unknown,K,146
    20,C,G,Unknown,187
    ;;;;
       run;
    proc summary data=exp descendtypes chartype;
       class var: / mlf;
       ways 1;
       freq Exposure;
       output out=test(rename=(_freq_=TotExposures));
       run;
    data want;
       length variable $32 levels $8;
       set test;
       array v[*] var1-var3;
       drop var1-var3 i _type_;
       i = indexc(_type_,'1');
       variable = vname(v[i]);
       levels = v[i];
       run;
    

    【讨论】:

    • 创建'want'的数据步骤不能不使用数组来完成,因为原始数据集包含350个不同名称的变量,我无法初始化数据步骤中的所有变量。感谢您的帮助:)
    • 如果您说这不适用于 350 个或更多变量,那您就错了。您只需要知道如何使用“SAS 变量列表”。如果您提及所有细节而不是一一列举,这将很有帮助。
    • 基本上变量名可以是任何东西。再具体一点。列名是 AgeGroup、PolicyGroup、ClaimCosts、Claimreturns ......等,级别是每个组中的值。
    • 此外,数据集还包含 400 万个条目。主要挑战是获取您创建的数据集,然后我必须再次对其进行子集化以获得理想的结果。
    • @desmond.carros 请参阅我的第二个答案,该答案解决了您的所有问题。您需要研究该程序以了解它是如何工作的,因为这些技术对您来说是新的。
    【解决方案2】:

    很抱歉将我的旧答案带到新帖子中,但取决于您对特定过程摘要的需要,我的旧方法会为您计算。

    如果您将最后一个 SQL 部分(我刚刚添加)换成:

    proc sql;
    create table OUT as
      select VARIABLENAME
                , VARIABLEVALUE
                , sum(EXPOSURE)
        from
            GET_MAX
        group by 1,2
    ;quit;
    

    【讨论】:

    • 好吧。确实,原始数据集可能包含 4500 万个观测值和 350 多个具有不同变量名称的变量。恐怕代码可能效率低下。但是让我们假设变量被命名为 Var1、Var2... 但它可能会达到 350 多条记录。
    • 请在主问题中添加相关信息,例如num/var命名。
    • @Reeza 你能指出哪里需要更正吗?
    • @desmond.carros 鉴于您的新信息,此答案不正确。请向主要问题添加新信息。
    • @Reeza 实际上 AmitPatel 参考了我的一个老问题给出了这个答案。尽管此查询仍未解决。你可以试试这个查询。 :)
    【解决方案3】:

    这将轻松处理 350 个变量 4500 万条记录需要一段时间,但 PROC Summary 也可以轻松处理。变量 LEVELS 需要定义为长度等于或大于所有类变量的最长格式化值。您可以在另一个问题中询问这是如何完成的。

    data exp;
       infile cards dsd firstobs=2;
       input Policy_Number (var1-var3) ($) Exposure;
       arbitraryname243 = rank(first(var1));
       arbitraryname4 = rantbl(123,.4);
       arbitraryname36 = rank(first(var3));
       cards;
    Policy_Number,var1,var2,var3,Exposure
    1,B,H,J,191
    2,B,F,Unknown,174
    3,C,Unknown,I,153
    4,B,G,L,192
    5,Unknown,E,Unknown,184
    6,D,E,K,113
    7,C,Unknown,I,140
    8,A,H,I,133
    9,C,F,I,194
    10,Unknown,G,Unknown,105
    11,B,H,L,172
    12,A,Unknown,I,198
    13,D,E,K,155
    14,Unknown,G,K,177
    15,B,H,Unknown,100
    16,D,Unknown,J,176
    17,B,E,I,112
    18,Unknown,E,J,192
    19,C,Unknown,K,146
    20,C,G,Unknown,187
    ;;;;
       run;
    proc transpose data=exp(obs=0 drop=policy_number exposure) out=varlist;
       var _all_;
       run;
    Proc sql noprint; 
       select nliteral(_name_) into :classvars separated by ' ' from varlist;
       quit;
    %put NOTE: &=classvars;
    
    proc summary data=exp descendtypes chartype;
       class &classvars / mlf;
       ways 1;
       freq Exposure;
       output out=test(rename=(_freq_=TotExposures));
       run;
    data want(keep=Variable levels totexposures);
       length variable $32 levels $8;
       set test;
       array v[*] &classvars;
       i = indexc(_type_,'1');
       variable = vname(v[i]);
       levels = v[i];
       run;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多