我正在处理多种格式的重复测量数据集。每个观察值代表一个对象的一个度量,每个对象度量六次。数据主要包含虚拟变量。
我希望对每个主题的所有六个观测值进行唯一的虚拟变量值计数。
拥有:
MeasurementNum SubjectID Dummy0 Dummy1 Dummy2 Dummy3 Dummy4
-----------------------------------------------------------------------------
1 1 1 1 0 0 0
2 1 0 1 0 1 0
3 1 - - - - -
4 1 0 0 1 1 0
5 1 - - - - -
6 1 0 0 0 1 0
1 2 1 0 0 1 0
2 2 0 0 0 0 0
3 2 0 1 0 0 0
4 2 1 1 0 1 0
5 2 - - - - -
6 2 1 1 1 0 0
想要:
Total for Overall
MeasurementNum SubjectID ... MeasurementNUM Total
--------------------------------...-----------------------------
1 1 ... 2 4
2 1 ... 2 4
3 1 ... - 4
4 1 ... 2 4
5 1 ... - 4
6 1 ... 1 4
1 2 ... 2 4
2 2 ... 0 4
3 2 ... 1 4
4 2 ... 3 4
5 2 ... - 4
6 2 ... 3 4
我目前的方法是使用Proc MEANS
和BY
和OUTPUT
语句将每个主题中的所有六行合并为一个保留值1的行,如this中所述题。然后,我使用Proc SUMMARY
获取have语句中变量'Total`下列出的值。
proc summary
data=have;
By SubjectID
class Dummy1-4;
output out=want sum=sum;
有没有一种方法可以在不先合并行的情况下获得观测值中的唯一/唯一计数?
我更喜欢PROC SQL
,因为它还允许我根据工作数据集中存在的主题协变量进行条件计数。即在特定于该对象的协变量的条件下生成需求描述。
答案 0 :(得分:1)
我怀疑使用PROC SUMMARY
(又名PROC MEANS)将是最简单的方法。听起来好像您想为每个主题找到MAX,然后对这些主题求和以求和。
proc summary data=have nway ;
class SubjectID ;
var Dummy0-Dummy999;
output out=any(drop=_type_ _freq_) n=n_reps max= ;
run;
data want ;
set any ;
total = sum(of Dummy0-Dummy999) ;
run;
不确定SQL如何帮助条件计数。但是您可以使用PROC SQL一步生成计数和总计,但这将需要如下墙纸代码:
proc sql ;
create table want as
select SubjectID
, count(*) as n_reps
, max(dummy0) as dummy0
, max(dummy1) as dummy1
...
, max(dummy999) as dumyy999
, sum
( max(dummy0)
, max(dummy1)
...
, max(dummy999)
) as Total
from have
group by 1
;
quit;
您可能可以定义一个宏(或其他工具),以从变量名列表中为您生成墙纸代码。