SAS Двумерный массив для подсчета пропущенных значений символьных переменных в строках - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть набор данных из 10 наблюдений и 6 символьных переменных в виде дней и городов. Каждая переменная имеет наблюдение как имя дня или отсутствующее значение «NA» для переменных с именем дня. Точно так же каждая переменная имеет наблюдение в виде либо названия города, либо пропущенного значения «NA» для переменных с названием города. Я хотел бы посчитать количество пропущенных значений в этих символьных переменных с помощью двумерного массива SAS как часть упражнения. Сообщения журнала, которые я получил, следуют за кодом ниже.

data want;
  set have;
  array var{2,3} i_Day5 Day6 Day7 City1-City3;
  array m{2} 8;
  do i=1 to 3;
    do j=1 to 3;
      m{i}=sum(m{i},ifn(var{i,j}="NA",0,1));
    end;
  end;
run;

В журнале отображается предупреждение

WARNING: An array has been declared with the same name as a built in
or user defined function.
References to var() will refer to the array definition, not the function call.

Я получаю следующую ошибку:

Array subscript 3 out of range [1-2] for dimension 1 of array m at line 254 column 1

Ошибка может возникать при наличии несуществующих записей. Пожалуйста, дайте мне знать, какие советы вы должны обойти эту ошибку.

1 Ответ

0 голосов
/ 24 апреля 2018

ПРЕДУПРЕЖДЕНИЕ возникает при объявлении массива с именем VAR, который будет использоваться на шаге DATA вместо функции VAR, которая обычно «возвращает дисперсию непропущенных аргументов».

ОШИБКАпроисходит, потому что массив m был объявлен как {2}, то есть он имеет два адресуемых индекса, а именно 1 и 2.

Когда индекс цикла i переходит на 3, выпытаются получить доступ к m{3}, и возникает ОШИБКА.

При работе с кодом, который зацикливается на массивах, границы которых могут изменяться из-за экспериментов по кодированию или разрешений макропеременных, наиболее безопасная итерация DO LOOP будет использовать LBOUND и HBOUND функции для начального и конечного значений.Эти функции возвращают самый низкий и самый высокий индекс измерения массива.

do rowIndex = lbound(var,1) to hbound(var,1);
  do colIndex = lbound(var,2) to hbound(var,2);
    m{rowIndex} = ...;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...