В SAS: как объединить ненулевые значения в строках по группам - PullRequest
0 голосов
/ 09 января 2019

У меня есть набор данных, состоящий из переменных ObservationNumber, MeasurementNumber, SubjectID и многих фиктивных переменных.

Я хотел бы объединить все ненулевые значения в одну строку по SubjectID GroupNumber.

Есть:

ObsNum    MeasurementNum    SubjectID    Dummy0    Dummy1  ...    Dummy999         
----------------------------------------------------...---------------   
01                1          1          0          1            ...    0
02                2          1          0          1            ...    0
03                3          1          0          1            ...    0
04                4          1          0          0            ...    0
05                5          1          -          -            ...    -
06                6          1          0          0            ...    0
07                1          2          1          0            ...    0
08                2          2          0          0            ...    0  
09                3          2          0          1            ...    0
10                4          2          1          0            ...    0
11                4          2          0          1            ...    0 
12                5          2          0          0            ...    1  
13                6          2          0          0            ...    0  
14                6          2          0          0            ...    1  
15                6          2          0          0            ...    0  
16                6          2          0          0            ...    0  
17                6          2          0          1            ...    0  
18                6          2          0          0            ...    0  
19                6          2          0          0            ...    0  
20                6          2          0          0            ...    0  
21                6          2          1          0            ...    0   
22                1          3          1          0            ...    0
23                2          3          0          1            ...    0
24                3          3          0          0            ...    1
25                4          3          -          -            ...    -
26                5          3          0          0            ...    0
27                6          3          0          0            ...    0  
28                1          4          -          -            ...    -
29                2          4          0          0            ...    0
30                3          4          0          1            ...    0
31                4          4          1          0            ...    0
32                4          4          0          1            ...    0
33                4          4          0          0            ...    1   
34                5          4          0          0            ...    1
35                6          4          0          1            ...    0
36                6          4          0          0            ...    1 

Хотите:

   MeasurementNum    SubjectID    Dummy0    Dummy1  ...    Dummy999         
----------------------------------------------------...---------------   
                1          1          0          1            ...    0
                2          1          0          1            ...    0
                3          1          0          1            ...    0
                4          1          0          0            ...    0
                5          1          -          -            ...    -
                6          1          0          0            ...    0
                1          2          1          0            ...    0
                2          2          0          0            ...    0  
                3          2          0          1            ...    0
                4          2          1          1            ...    0
                5          2          0          0            ...    1  
                6          2          1          1            ...    1  
                1          3          1          0            ...    0
                2          3          0          1            ...    0
                3          3          0          0            ...    1
                4          3          -          -            ...    -
                5          3          0          0            ...    0
                6          3          0          0            ...    0  
                1          4          -          -            ...    -
                2          4          0          0            ...    0
                3          4          0          1            ...    0
                4          4          1          1            ...    1
                5          4          0          0            ...    1
                6          4          0          1            ...    1

Каждый SubjectID имеет шесть измерений, в которых набор фиктивных переменных измеряется без результата 0, 1 или отсутствует. Если происходит пропущенное значение, все фиктивные переменные для соответствующего наблюдения отсутствуют - и в наборе данных для этого `MeasurementNumber. Будет присутствовать только одно наблюдение.

Я пытался использовать оператор UPDATE, но, похоже, он не в состоянии справиться с '0' и '-'.

Существует ли прямой способ сжатия всех фиктивных переменных в этом наборе данных для каждого SubjectID, сгруппированного по MeasurementNumber?

1 Ответ

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

Используйте Proc MEANS с BY и OUTPUT операторами.

data have;
  rownum = 0;
  do rowid = 1 to 1000;
    subjectid + 1;
    do measurenum = 1 to 6;
      do repeat = 1 to ceil(4 * ranuni(123));
        array flags flag1-flag999;
        do _n_ = 1 to dim(flags);
          flags(_n_) = ranuni(123) < 0.10;
          if subjectid < 7 and measurenum = subjectid then flags(_n_) = .;
        end;
        rownum + 1;
        output;
      end;
    end;
  end;
  keep rownum measurenum subjectid flag:;
run;

proc means noprint data=have;
  by subjectid measurenum;
  var flag:;
  output max=;
run;
...