计算每个参与者的价值

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 计算满足条件的组的聚合结果,并将该聚合值自动合并到结果集中。

-或-

使用 MEANSTRANSPOSEMERGE 方法

示例代码 (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;