Как использовать массив для создания таблицы поиска - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть набор данных, который содержит три столбца: код станции, код назначения, тариф.По сути, данные внутри station_code и dest_cde одинаковы, и тариф - это плата, необходимая для перехода на конкретную станцию.

station_code dest_code fare
station1     station1  0
station1     station2  4.6
station1     station3  10
station1     station4  10
station1     station5  12.3
station1     station6  12.3
station1     station7  12.3
station1     station8  12.3
station1     station9  14.7 
station1     station10 14.7
           .
           .
           .
station1     station91 27.5
station2     station1  4.6
station2     station2  0
station2     station3  10
station2     station4  10
station2     station5  12.3
station2     station6  12.3
station2     station7  12.3
station2     station8  12.3
station2     station9  14.7 
station2     station10 14.7
          .
          .
          .

до станции91

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

fee  1    2    3    4   ...
1    0    4.6  10   10
2    4.6  0    10   10
3    10   10   0    4.6
4    10   10   4.6  0
5    12.3 12.3 4.6  4.6
...  ...  ...  ...  ...

Как вы можете видеть, индекс в строке и столбце фактически представляет имя станции, например, row1 = station1, column1 =станция1, столбец2 = станция2.

Ответы [ 3 ]

0 голосов
/ 18 апреля 2019

Вы можете получить свою таблицу таким образом с помощью PROC TRANSPOSE, сортировать данные заранее.

 proc sort data=have ; 
 by station_code dest_code fare;
 run;

 proc transpose data=have out=want;
 by station_code;
 id dest_code;
 var fare;
 run;
0 голосов
/ 19 апреля 2019

Вы описываете fare как двумерный массив. То, как вы «загружаете» массив, зависит от того, как вы планируете использовать «поиск».

Предположим:

  • тарифов в одном наборе данных: station_code, dest_code, fare
    • значения кода станции буквально station1station91
  • точек маршрута во втором наборе данных: personid, step_num, station_code
  • Вы хотите рассчитать общий тариф для каждого человека
* +1025 * Пример:
data totals(keep=personid totalfare);
  * load the station fares into temporary array for use as lookup table;
  array fares(91,91) _temporary_;
  do until (lastfare);
    set fares end=lastfare;
    _from = input(substr(station_code,8),best.);  * parse the number out of code;
    _dest = input(substr(dest_code,8),best.);
    fares(_from,_dest) = fare;
  end;

  * compute each persons total fare;
  do until (endtrips);
    totalfare = 0;
    _from = 0;
    do until (last.personid);
      set trips end=endtrips;
      by personid step_num;

      _dest = input(substr(station_code,8),best.);
      if _from and _dest then totalfare + fares(_from,_dest);
      _from = _dest;
    end;
    output;
  end;

  stop;
run;

Если значения кода станции на самом деле , а не значение, из которого можно проанализировать 191, массив не может использоваться - Вместо этого хеш-объект с двухзначным ключом следует использовать в качестве поиска.

data totals (keep=personid totalfare);
  * load the station fares into hash for use as lookup table;
  if 0 then set fares; * prep pdv;
  declare fares hash(dataset:'fares');
  fares.defineKey('dest_code', 'station_code'); * reversed keys make it easier to traverse trips;
  fares.defineData('fare');
  fares.defineDone();  * automatically reads dataset:fares and fills hash entries;

  * compute each persons total fare;
  do until (endtrips);
    totalfare = 0;
    dest_code = '';
    do until (last.personid);
      set trips end=endtrips;                  * read in the station for a persons step;
      by personid step_num;

      if fares.find()=0 then do;  * 0 return code means variable fare has the value for the fare from station_code to dest_code;
        totalfare + fare;
      end;

      * prepare for next leg of journey, this is what is meant by easier to traverse;
      dest_code = station_code;
    end;
    output;
  end;

  stop;
run;
0 голосов
/ 18 апреля 2019

Вопрос очень запутанный, и я хотел бы еще раз уточнить мою таблицу и таблицу поиска.

для первого изображения, это оригинальная таблица введите описание изображения здесь

введите описание изображения здесь второе изображение - это таблица поиска, которую я хочу

...