проблема с тем, почему переменная принимает определенное значение - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь создать переменную, которая будет указывать (на «1»), когда она достигает определенного числа (когда в процессе происходит улучшение). Затем я пытаюсь сбросить базовую линию, так что для ее пометки должен быть достигнут новый базовый уровень (порог). набор данных начинается с одной переменной (x). Я создаю еще одно из первого наблюдения под названием «базовая линия», поэтому я буду сравнивать все остальные «х» с базовой линией. как только я достигну порога, я хочу изменить базовую линию на порог, который он только что достиг.

здесь соответствующая часть кода (обратите внимание, что я уже создал код, который определил базовый уровень ранее в программе).

data combo;
set combo;
if (baseline-x)/8 >1 then do;

flag=1;
baseline=x;
end;
else 
flag=0;
run;

здесь соответствующая часть вывода.

Я ожидаю, что флаг будет равен 1 (что и есть) для третьего наблюдения (потому что базовая линия началась в 259, а затем переместилась в 251, как я хочу. Но почему флаг = 1 после этого? Порог не встретил. может кто-нибудь помочь? спасибо Джон
enter image description here

Ответы [ 3 ]

0 голосов
/ 03 мая 2020

Шаг данных перезаписывает исходное значение BASELINE после того, как он устанавливает переменную FLAG в 1. Таким образом, мы не можем увидеть, какое значение оно имело при чтении из исходного значения набора данных COMBO, но мы можем предположить, что оно было по крайней мере 8 больше чем X, чтобы вызвать go вниз по этой ветви оператора IF.

0 голосов
/ 07 мая 2020

Вам нужна отдельная переменная для отслеживания текущей базовой линии. Вы можете использовать RETAIN для этого.

data out;
   set combo;

   ** Keep the value of this for each observation in the data set **;
   retain current_baseline;

   ** Initialize baseline to starting value for data set **;
   if _n_ = 1 then current_baseline = baseline;

   if (current_baseline - x) / 8 < 1 then do;
      flag = 1;
      ** Update current_baseline to new value since flag has been tripped **;
      current_baseline = x;
   end;
   else flag = 0;

   ** If you want to store the value of baseline for later viewing, you can **;
   baseline = current_baseline;

run;

Обратите внимание, что вам действительно нужны только значения x и начальное базовое значение для запуска. Допустим, ваша начальная базовая линия равна x - 8. Затем вы можете просто изменить строку инициализации на

   ** Initialize baseline to starting value for data set **;
   if _n_ = 1 then current_baseline = x - 8;

Затем вы можете запустить это с вашим необработанным набором данных, используя только значения для x.

0 голосов
/ 03 мая 2020

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

  if ((baseline-x)/8) >1 then 
        do;
           flag=1;
           baseline=x;
        end;
        else 
        flag=0;
    run;
...