Как пометить последовательность весов, однажды превышающую 30 весов, отметьте остаток 1? - PullRequest
0 голосов
/ 19 марта 2020

Здесь у меня есть список весом 2 предмета.

data weight_test;
         format subject $3. weight 4.;
         infile datalines dlm=" " dsd;
         input subject  weight ;
datalines;
001 27
001 27.5
001 28
001 30
001 29
001 29
002 29
002 30
002 31
002 29
;
run;

Я хочу отметить вес с 0 и 1: Если вес <30, отметьте 0; Как только вес> = 30, отметьте остаток веса в том же предмете 1. Как следующие списки:

subject  weight  mark
001     27      0
001     27      0
001     28      0
001     30      1
001     29      1
001     29      1
002     29      0
002     30      1
002     31      1
002     29      1

Я пытался использовать следующие коды, но это не работает должным образом. Пожалуйста, помогите мне. Спасибо ~

data weight;
    set weight_test;
    by subject;
    i=0;
    retain i;
    if      weight < 30 then mark=i;
    else if weight >= 30 then do;
        i = 1;
        mark = i;
    end;
run;

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Вы слишком усложнили это. Просто установите MARK на ноль, когда вы начинаете новый предмет, и установите его на единицу, когда вы видите целевой вес.

data weight_test;
  input subject $ weight @@ ;
datalines;
001 27 001 27.5 001 28 001 30 001 29 001 29
002 29 002 30 002 31 002 29
;

data weight;
  set weight_test;
  by subject;
  if first.subject then mark=0;
  if weight >= 30 then mark=1;
  retain mark;
run;

Результаты:

Obs    subject    weight    mark

  1      001       27.0       0
  2      001       27.5       0
  3      001       28.0       0
  4      001       30.0       1
  5      001       29.0       1
  6      001       29.0       1
  7      002       29.0       0
  8      002       30.0       1
  9      002       31.0       1
 10      002       29.0       1

Убедитесь, что переменная MARK не уже существует во входном наборе данных.

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

Попробуйте это

data want;
   mark=0; _iorc_=0;
   do until (last.subject);
      set weight_test;
      by subject;
      if weight >= 30 & _iorc_=0 then do;
         _iorc_=1;
         mark=1;
      end;
      output;
   end;
run;
...