Подсчет значения в пределах определенного диапазона в массиве в SAS - PullRequest
0 голосов
/ 19 октября 2018

Итак, мой набор данных выглядит следующим образом:

ABC1 ABC2 ABC3 ABC4 ABC5 DEF1 DEF2 DEF3 DEF4 DEF5  
  1    0    0    1    .    0    1    1    0   .

Я хочу, чтобы мой вывод был:

XYZ1 XYZ2 XYZ3 XYZ4 XYZ5
 0    1    1    0    .       

В основном, если DEF2 = 1 и число ABC3 и ABC4 и ABC5 равно 1> 0, тогда XYZ2 равно 1.

Я пробовал следующий код, но он не работает

data want;
set have;
array ABC ABC:;
array DEF DEF:;
array XYZ [5] $1;
do i = 1 to dim(ABC)-5;

if ABC(i) = . then XYZ(i) = '';
else if (DEF(i) = 1 and sum(ABC(i+1), ABC(i+3)) > 0) then XYZ(i) = 1;
else XYZ(i) = 0;
end;
drop i;
run;

1 Ответ

0 голосов
/ 19 октября 2018

Позволяет вращать вещи для лучшего понимания

index ABC DEF XYZ (wanted)
----- --- --- ---
  1    1   0   0 (because DEF=0)
  2    0   1   1 (sum ABC index 2..5 because DEF=1 @ index 2)
  3    0   1   1 (sum ABC index 3..5 because DEF=1 @ index 3)
  4    1   0   0 (because DEF=0)
  5    .   .   . (because DEF=.)

Теперь примените это понимание к обработке переменных строки в массиве.Элементы будут обрабатываться от 5 до 1, поэтому при необходимости можно вычислить и использовать сумму_производства.

data want;
  set have;

  array abc abc:;
  array def def:;
  array xyz(5);

  running_sum = .;
  do index = dim(abc) to 1 by -1;
    if not missing(abc(index)) then running_sum + abc(index);
    if def(index) in (., 0)
      then xyz(index) = def(index);
      else xyz(index) = running_sum;
  end;
run;

В вопросе указаны не все правила обработки, например

  • дело abc(j) = . и abc(k) ne . и k > j

Такое дело может никогда не произойти.

...