SAS, как эффективно искать и сопоставлять - PullRequest
0 голосов
/ 14 июля 2020

У меня есть таблица A из 36 столбцов имен. Есть файл xwalk с идентификатором имени, назовем его x. Мне нужно добавить в таблицу A 36 столбцов идентификаторов, используя файл xwalk x.

Фактические размеры данных / таблиц приведены здесь для соображений эффективности, если это необходимо: моя таблица A имеет 340 строк, имена - все тексты. В таблице xwalk x более 700 строк, все идентификаторы - c. каждый раз, когда столбец в A имен должен быть сопоставлен с идентификаторами, xwalk может быть разделен на меньшее количество потенциальных пулов. Размер таких подмножеств варьируется от: 9 до 140.

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

для простоты, пример кода данных для таблицы A имеет 4 столбца.

data A;
 input  name1 $1-5  name2 $7-10 name3 $12-15 name4 $17-20;
 datalines;
Harry Mary John Kate
Lee   Sam  Joel Sky
;
run;

data x;
input name $1-5 id;
datalines;
Harry 1
Marry 2
John  3
Kate  4
Sam   5
Sky   7
Joel  12
Lee  99
;
run;


data want;
input name1 $1-5  name2 $7-10 name3 $12-15 name4 $17-20 id1 id2 id3 id4;
datalines;
Harry Mary John Kate 1 2 3 4
Lee   Sam  Joel Sky 99 5 12 7
;
run;

1 Ответ

3 голосов
/ 14 июля 2020

Вот ха sh версия объекта / массива:

data want;
    if _n_ = 1 then do;
        if 0 then set x;
        declare hash x(dataset:"x");
        x.DefineKey("name");
        x.DefineData("id");
        x.DefineDone();
    end;
    
    set a;
    array nms{4} $ name1-name4;
    array ids{4} id1-id4;

    do i = 1 to dim(nms);
        if x.find(key:nms{i}) = %sysrc(_sok) then ids{i} = id;
        else id = .;
    end;
    
    drop i id name;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...