Альтернатива подходу PROC SUMMMARY при суммировании переменных по нескольким наблюдениям - PullRequest
0 голосов
/ 23 января 2019

Я имею дело с набором данных повторных измерений в широком формате.Каждое наблюдение представляет одно измерение для одного субъекта, и каждый предмет измеряется шесть раз.Данные содержат в основном фиктивные переменные.

Я собираюсь подсчитать уникальные значения фиктивных переменных по всем шести наблюдениям для каждого субъекта.

Имею:

 MeasurementNum    SubjectID    Dummy0    Dummy1    Dummy2    Dummy3   Dummy4         
-----------------------------------------------------------------------------   
            1          1          1          1         0         0         0
            2          1          0          1         0         1         0
            3          1          -          -         -         -         -
            4          1          0          0         1         1         0
            5          1          -          -         -         -         -
            6          1          0          0         0         1         0
            1          2          1          0         0         1         0
            2          2          0          0         0         0         0  
            3          2          0          1         0         0         0
            4          2          1          1         0         1         0
            5          2          -          -         -         -         -  
            6          2          1          1         1         0         0  

Want:

                                       Total for       Overall
 MeasurementNum    SubjectID    ...    MeasurementNUM  Total      
--------------------------------...-----------------------------  
            1          1        ...          2         4                  
            2          1        ...          2         4                  
            3          1        ...          -         4                  
            4          1        ...          2         4                 
            5          1        ...          -         4                
            6          1        ...          1         4                  
            1          2        ...          2         4                  
            2          2        ...          0         4                    
            3          2        ...          1         4                  
            4          2        ...          3         4                  
            5          2        ...          -         4                    
            6          2        ...          3         4                                 

Мой текущий подход состоит в том, чтобы объединить все шесть строк в каждом субъекте в одну строку, сохраняя значение 1, используя Proc MEANS с операторами BY и OUTPUT, как описано в this связанный вопрос.Затем я использую Proc SUMMARY, чтобы получить значения, перечисленные в переменной 'Total` в операторе have.

proc summary
data=have;
By SubjectID
class Dummy1-4;
output out=want sum=sum;  

Есть ли способ получить отдельные / уникальные значения для наблюдений без предварительной консолидации строк?

Я предпочитаю PROC SQL, поскольку это также позволит мне выполнять условные подсчеты в соответствии с предметными ковариатами, присутствующими в моем рабочем наборе данных.Т.е. создание нужных описаний при условии ковариации, специфичной для предмета.

1 Ответ

0 голосов
/ 23 января 2019

Я подозреваю, что использование PROC SUMMARY (он же PROC MEANS) будет самым простым способом. Похоже, вы хотите найти МАКС для каждого СУБЪЕКТА, а затем СУММАТЬ их, чтобы получить итоговые данные по предмету.

proc summary data=have nway ;
  class SubjectID ;
  var Dummy0-Dummy999;
  output out=any(drop=_type_ _freq_) n=n_reps max= ;
run;

data want ;
  set any ;
  total = sum(of Dummy0-Dummy999) ;
run;

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

proc sql ;
  create table want as 
    select SubjectID
         , count(*) as n_reps
         , max(dummy0) as dummy0
         , max(dummy1) as dummy1
         ...
         , max(dummy999) as dumyy999
         , sum
         ( max(dummy0) 
         , max(dummy1) 
         ...
         , max(dummy999)
         ) as Total
    from have
    group by 1
  ;
quit;

Возможно, вы могли бы определить макрос (или какой-либо другой инструмент) для генерации этого кода обоев для вас из списка имен переменных.

...