SAS - 对个人观察进行分组

时间:2015-03-30 03:01:39

标签: sas

抱歉,我对SAS的许多功能都不熟悉 - 我只使用了几个月,主要用于调查数据分析,但现在我正在使用一个数据集,该数据集具有单独的数据级别用于交叉 - 研究。它的形式为:ID治疗期措施1措施2 ....

我想要做的是能够按照治疗组对这些个体进行分组,然后输出一个变量,其中测量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

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

/ 创建样本数据集 /

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汇总trtper /

  1. 您想要汇总的变量(维度)将进入class
  2. 您希望获得平均值的变量(度量)将进入var
  3. 由于您希望生成average,因此您必须将mean写为所需的统计信息。
  4. 在此处阅读有关proc摘要的更多信息

    在这里


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

答案 1 :(得分:0)

替代方法使用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子句中添加列会导致问题。