Sas 每个参与者的计算值
我想向数据集中添加一个新列,但我不确定如何添加。我的数据集有一个名为KEYVAR(character variable)的变量,它有三个不同的值。参与者可以在我的数据集中出现多次,每一行包含一个类似或不同的KEYVAR值。我想做的是创建一个新的变量NEWVAR,它计算参与者拥有KEYVAR特定值的次数;当参与者对该特定值没有观察时,我希望NEWVAR的结果为零 下面是一个我想要的数据集示例(在这个示例中,我想将每个参与者的每个“Y”实例都计算为newvar):Sas 每个参与者的计算值,sas,sas-macro,Sas,Sas Macro,我想向数据集中添加一个新列,但我不确定如何添加。我的数据集有一个名为KEYVAR(character variable)的变量,它有三个不同的值。参与者可以在我的数据集中出现多次,每一行包含一个类似或不同的KEYVAR值。我想做的是创建一个新的变量NEWVAR,它计算参与者拥有KEYVAR特定值的次数;当参与者对该特定值没有观察时,我希望NEWVAR的结果为零 下面是一个我想要的数据集示例(在这个示例中,我想将每个参与者的每个“Y”实例都计算为newvar): have PARTICIPANT
have
PARTICIPANT KEYVAR
A Y
A N
B Y
B Y
B Y
C W
C N
C W
D Y
D N
D N
D Y
D W
want
PARTICIPANT KEYVAR NEWVAR
A Y 1
A N 1
B Y 3
B Y 3
B Y 3
C W 0
C N 0
C W 0
D Y 2
D N 2
D N 2
D Y 2
D W 2
您可以使用
Proc SQL
对满足条件的组计算聚合结果,并将该聚合值自动合并到结果集中
-或-
使用方法
,转置
,合并
方法
示例代码(SQL)
示例代码(过程和合并)
您的输入数据到底是什么样的?数据集中是否有WNW记录?你试过什么?请在此查看指导原则
data have;
input ID $ value $; datalines;
A Y
A N
B Y
B Y
B Y
C W
C N
C W
D Y
D N
D N
D Y
D W
E X
;
proc sql;
create table want as
select ID, value
, sum(value='Y') as Y_COUNT /* relies on logic eval 'math' 0 false, 1 true */
, sum(value='N') as N_COUNT
, sum(value='W') as W_COUNT
from have
group by ID
;
* format for PRELOADFMT and COMPLETETYPES;
proc format;
value $eachvalue
'Y' = 'Y'
'N' = 'N'
'W' = 'W'
other = '-';
;
run;
* Count how many per combination ID/VALUE;
proc means noprint data=have nway completetypes;
class ID ;
class value / preloadfmt;
format value $eachvalue.;
output out=freqs(keep=id value _freq_);
run;
* TRANSPOSE reshapes to wide (across) data layout, one row per ID;
proc transpose data=freqs suffix=_count out=counts_across(drop=_name_);
by id;
id value;
var _freq_;
where put(value,$eachvalue.) ne '-';
run;
* MERGE;
data want_way_2;
merge have counts_across;
by id;
run;