抱歉,我对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
感谢您的帮助。
答案 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
汇总trt
和per
/
class
var
average
,因此您必须将mean
写为所需的统计信息。在此处阅读有关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
子句中添加列会导致问题。