En la siguiente tabla estoy intentando crear Switch_from_start:

start_ind : creé este valor para asegurar cuando name = "Start" como el primer elemento dentro del mismo ID después de ordenarlo en orden descendente.

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 : cualquier cambio en el valor en comparación con el valor cuando name = "Start" dentro del mismo ID. Por lo tanto, si aparece un valor diferente dentro del mismo ID, switch_from_start será "sí" + valor_inicial + valor que apareció más tarde que es diferente al valor inicial. (consulte el ejemplo de salida a continuación)

enter image description here

¡Cualquier ayuda será apreciada!

sas
0
lydias 3 oct. 2019 a las 05:40

1 respuesta

La mejor respuesta

Está aplicando un 'valor calculado sobre el grupo' a la primera fila del grupo. Este tipo de flujo de procesamiento de datos se puede lograr con un bucle DOW para el cálculo sobre el grupo seguido de un bucle en serie sobre el grupo para su aplicación y salida. El seguimiento de los primeros valores distintos que se producen en el grupo se puede realizar de diversas formas, incluida una matriz temporal de tamaño máximo, un hash de tamaño dinámico o una concatenación delimitada.

Ejemplo usando concatenación delimitada:

findw se usa para verificar un valor previamente concatenado (este es el seguimiento). Los delimitadores son un guión bajo (_) que es su separador, y espacio ( ) para los espacios finales de la concatenación.

dountil es el bucle DOW y doto _n_ es el bucle en serie. Observe cómo se borra el valor calculado después de estar output en la primera fila de cada grupo.

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;
1
Richard 3 oct. 2019 a las 11:40