计算每个参与者的价值
COUNTING VALUE PER PARTCIPANTS
我想向数据集添加一个新列,但我不确定如何操作。我的数据集有一个名为 KEYVAR(字符变量)的变量,它具有三个不同的值。参与者可以在我的数据集中出现多次,每行包含相似或不同的 KEYVAR 值。我想做的是创建一个新变量调用 NEWVAR,它计算参与者对 KEYVAR 具有特定值的次数;当参与者没有对该特定值的观察时,我希望 NEWVAR 的结果为零。
这是我想要的数据集示例(在此示例中,我想将每个参与者的每个 "Y" 实例都算作 newvar):
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
计算满足条件的组的聚合结果,并将该聚合值自动合并到结果集中。
-或-
使用 MEANS
、TRANSPOSE
、MERGE
方法
示例代码 (SQL)
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
;
示例代码(PROC 和 MERGE)
* 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;
我想向数据集添加一个新列,但我不确定如何操作。我的数据集有一个名为 KEYVAR(字符变量)的变量,它具有三个不同的值。参与者可以在我的数据集中出现多次,每行包含相似或不同的 KEYVAR 值。我想做的是创建一个新变量调用 NEWVAR,它计算参与者对 KEYVAR 具有特定值的次数;当参与者没有对该特定值的观察时,我希望 NEWVAR 的结果为零。
这是我想要的数据集示例(在此示例中,我想将每个参与者的每个 "Y" 实例都算作 newvar):
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
计算满足条件的组的聚合结果,并将该聚合值自动合并到结果集中。
-或-
使用 MEANS
、TRANSPOSE
、MERGE
方法
示例代码 (SQL)
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
;
示例代码(PROC 和 MERGE)
* 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;