SAS Сравнение значений в группах - PullRequest
0 голосов
/ 03 октября 2019

В следующей таблице я пытаюсь создать Switch_from_start:

start_ind : я создал это значение для защиты, когда name = "Start" в качестве первого элемента в том же идентификаторе послеотсортировано в порядке убывания.

Data df;
  set df;
if name = "Start" then start_ind = 1;
run;

proc sort data = df; by ID Name descending start_id; run; 
/*In the table below Name is not sorted*/

switch_from_start : любое изменение в значении по сравнению со значением, когда name = "Start" в пределах того же идентификатора. Таким образом, если в пределах того же идентификатора возникает другое значение, switch_from_start будет иметь значение «да» + start_value + позднее появится значение, которое отличается от начального значения. (см. пример вывода ниже)

enter image description here

Любая помощь будет оценена!

1 Ответ

1 голос
/ 03 октября 2019

Вы применяете «значение, вычисленное по группе» к первой строке в группе. Этот вид потока обработки данных может быть выполнен с помощью цикла DOW для вычислений по группе, за которым следует последовательный цикл по группе для применения и вывода. Отслеживание первых встречающихся отдельных значений в группе можно отслеживать различными способами, включая временный массив максимального размера, хеш динамического размера или конкатенацию с разделителями.

Пример с использованием конкатенации с разделителями:

findw используется для проверки ранее объединенного значения (это отслеживание). Разделителями являются подчеркивание (_), которое является вашим разделителем, и пробел () для конечных пробелов конкатенации

dountil - это DOWloop и doto _n_ - последовательный цикл. Обратите внимание, как вычисленное значение очищается после того, как оно было output в первой строке каждой группы.

data have;
  do id = 1 to 10;
    do _n_ = 1 to 20 * ranuni(123);
      length name $20;
      if _n_ = 1 
        then name = 'Start';
        else name = scan ('apple pear guava peach orange cherry lemon lime', ceil(8*ranuni(123)));

      value = ceil(6*ranuni(123));
      if id = 5 then 
        value = 1;

      output;
    end;
  end;
run;

data want;
  do _n_ = 1 by 1 until (last.id);
    set have;
    by id;

    length group_computation $75;

    if not findw (group_computation, strip(value), '_ ') then
      group_computation = catx('_', group_computation, value);
  end;

  if index(group_computation, '_') = 0
    then group_computation = 'no';
    else group_computation = 'Yes, ' || group_computation;

  do _n_ = 1 to _n_;
    set have;
    output;
    if _n_ = 1 then group_computation = '';
  end;    
run;
...