УЧЕТНАЯ СТОИМОСТЬ УЧАСТНИКОВ - PullRequest
0 голосов
/ 14 марта 2020

Я хотел бы добавить новый столбец в набор данных, но я не уверен, как это сделать. В моем наборе данных есть переменная с именем KEYVAR (символьная переменная) с тремя различными значениями. Участник может появляться несколько раз в моем наборе данных, причем каждая строка содержит одинаковое или разное значение для KEYVAR. Я хочу создать новую переменную с именем NEWVAR, которая подсчитывает, сколько раз участник имеет значение c для KEYVAR; когда у участника нет наблюдения для указанного значения c, я хочу, чтобы 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

1 Ответ

0 голосов
/ 14 марта 2020

Вы можете использовать Proc SQL, чтобы вычислить агрегированный результат по группе, отвечающей критериям, и автоматически объединить это агрегированное значение с набором результатов.

-OR-

Использовать 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
  ;

enter image description here

Пример кода (PRO C и 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;

enter image description here

...