【问题标题】:SAS - group individual observationsSAS - 分组个人观察
【发布时间】:2015-03-30 03:01:39
【问题描述】:

抱歉,我对 SAS 的许多功能都不熟悉 - 我只使用了几个月,主要用于调查数据分析,但现在我正在使用一个数据集,其中包含用于交叉的个人级别数据-过度学习。形式为:ID 治疗期 measure1 measure2 ....

我想要做的是能够按他们的治疗组对这些人进行分组,然后输出一个变量,其中包含测量 1 和测量 2 的组平均值以及另一个变量,其中包含每个组中的观察计数。

即

ID trt per  m1  m2
1   1   1  101  75
1   2   2  135  89
2   1   1  103  77
2   2   2  140  87
3   2   1  134  79
3   1   2  140  80
4   2   1  156  98
4   1   2  104  78

我想要的是表格中的数据:

group a = where trt=1 & per=1
group b = where trt=2 & per=2
group c = where trt=2 & per=1
group d = where trt=1 & per=2

trtgrp avg_m1 avg_m2 n
  A      102   76    2
  B      ...    ...  ...
  C
  D

感谢您的帮助。

【问题讨论】:

    标签: sas


    【解决方案1】:

    /创建样本数据集/

    data test;
    infile datalines dlm=" ";
    input ID : 8.
          trt : 8.
          per : 8.
          m1 : 8.
          m2 : 8.;
          put ID=;
    datalines;
    1 1 1 101 75
    1 2 2 135 89
    2 1 1 103 77
    2 2 2 140 87
    3 2 1 134 79
    3 1 2 140 80
    4 2 1 156 98
    4 1 2 104 78
    ;
    run;
    

    /使用proc summary总结trt和per/

    1. 您要总结的变量(维度)将进入class
    2. 您想要平均的变量(度量)将进入var
    3. 由于您希望生成 average,因此您必须将 mean 写为所需的统计信息。

    在此处阅读有关过程摘要的更多信息

    这里


    proc summary data=test nway;
    class trt per;
    var m1 m2;
    output out=final(drop= _type_)
    mean=;
    run;
    

    【讨论】:

      【解决方案2】:

      替代方法使用PROC SQL,优点是它使用纯英语语法,因此您的问题中的组概念保留在语法中:

      PROC SQL;
        CREATE TABLE final AS
        SELECT 
        trt,
        per,
        avg(m1) AS avg_m1,
        avg(m2) AS avg_m2,
        count(*) AS n
        FROM
        test
        GROUP BY trt, per;
      QUIT;
      

      您甚至可以通过应用条件CASE 逻辑来添加自己的组标题,就像您在问题中所做的那样:

      PROC SQL;
        CREATE TABLE final AS
        SELECT 
        CASE 
          WHEN trt=1 AND per=1 THEN 'A'
          WHEN trt=2 AND per=2 THEN 'B'
          WHEN trt=2 AND per=1 THEN 'C'
          WHEN trt=1 AND per=2 THEN 'D'
        END AS group
        avg(m1) AS avg_m1,
        avg(m2) AS avg_m2,
        count(*) AS n
        FROM
        test
        GROUP BY group;
      QUIT;
      

      COUNT(*) 只计算在组中找到的行数。 AVG 函数计算给定列的平均值。

      在每个示例中,您可以将 GROUP BY 子句中显式命名的列替换为表示 SELECT 子句中列位置的数字。

      GROUP BY 1,2
      

      但是,请注意此方法,因为稍后将列添加到 SELECT 子句可能会导致问题。

      【讨论】:

      • 非常感谢各位的帮助!两种方法都有效,但我喜欢 proc SQL 方法的简单性。干杯。
      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      相关资源
      最近更新 更多