Sas 每个参与者的计算值

Sas 每个参与者的计算值,sas,sas-macro,Sas,Sas Macro,我想向数据集中添加一个新列,但我不确定如何添加。我的数据集有一个名为KEYVAR(character variable)的变量,它有三个不同的值。参与者可以在我的数据集中出现多次,每一行包含一个类似或不同的KEYVAR值。我想做的是创建一个新的变量NEWVAR,它计算参与者拥有KEYVAR特定值的次数;当参与者对该特定值没有观察时,我希望NEWVAR的结果为零 下面是一个我想要的数据集示例(在这个示例中,我想将每个参与者的每个“Y”实例都计算为newvar): have PARTICIPANT

我想向数据集中添加一个新列,但我不确定如何添加。我的数据集有一个名为KEYVAR(character variable)的变量,它有三个不同的值。参与者可以在我的数据集中出现多次,每一行包含一个类似或不同的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
对满足条件的组计算聚合结果,并将该聚合值自动合并到结果集中

-或-

使用
方法
转置
合并
方法

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