Хэш-таблица SAS - многозначные значения для одного ключа и find_next - PullRequest
1 голос
/ 05 июня 2019

Я использую хеш-таблицу для поиска значений и определения соответствия.Это коды тестирования.

Я пытаюсь проверить, есть ли у студентов в roster записи в grade_roster;если у студента есть записи в grade_roster, я присоединяю это grade_on_report к новому набору данных, который является дубликатом roster.

name - мой ключ, а оценки - значения.Одно имя может иметь несколько оценок, то есть многозначности для одного ключа.Мне удалось найти все имена в roster, у которых есть совпадение в grade_roster, с использованием find_next(), но я не смог назначить правильную оценку новому набору данных.

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

Вот мой код:

data roster;
input name $ course $ grade_on_paper $;
  datalines;
  Mary English A
  Mary German B
  Josh English B
  Lily Spanish B
  Lucy Physics C
  John Music A
  Eric Math A
  Eric Music B
;
run;

data grade_roster;
input name $ course $ grade_on_report $;
  datalines;
  Mary English A
  Mary German B
  John Music A
  Eric Math A
  Eric Music B
;
run;

data assign_grade;
  set roster;
  format grade_on_report $1.;

  declare hash ht1(dataset:"grade_roster", multidata:"Y");
  ht1.defineKey("name");
  ht1.defineData("grade_on_report");
  ht1.defineDone();

  rc = ht1.find();
  do while(rc = 0);
    rc = ht1.find_next();
  end;
run;

То, что я получил, было:

    name    course  grade_on_paper  grade_on_report name_found      
1   Mary    English        A           B            Y   
2   Mary    German         B           B            Y               
3   Josh    English        B                        
4   Lily    Spanish        B                        
5   Lucy    Physics        C                        
6   John    Music          A           A            Y       
7   Eric    Math           A           B            Y       
8   Eric    Music          B           B            Y   

То, что я хочу:

    name    course  grade_on_paper  grade_on_report name_found      
1   Mary    English        A           A            Y   
2   Mary    German         B           B            Y               
3   Josh    English        B                        
4   Lily    Spanish        B                        
5   Lucy    Physics        C                        
6   John    Music          A           A            Y       
7   Eric    Math           A           A            Y       
8   Eric    Music          B           B            Y

Примечание: name и course вместе не являются уникальными идентификаторами.Кажется, что они являются уникальными идентификаторами в этом конкретном тестовом коде, но они не являются уникальными идентификаторами в фактическом наборе данных, над которым я работаю.Цель состоит в том, чтобы использовать name в качестве единственного ключа в ht1.defineKey() и получить правильный результат.

Любая помощь будет принята с благодарностью.Спасибо!

...