SAS vlookup - просматривать все данные, не только присоединенные - PullRequest
0 голосов
/ 08 апреля 2019

Я хотел бы видеть все данные из "одного" набора данных. Если соединение между таблицами не существует, перезапишите значение 0. Текущий код дает мне значения только там, где есть соединение. Эта таблица мне нужна:

enter image description here

    data one;
  input lastname: $15. typeofcar: $15. mileage;
datalines;
Jones Toyota 3000
Smith Toyota 13001
Jones2 Ford 3433
Smith2 Toyota 15032
Shepherd Nissan 4300
Shepherd2 Honda 5582
Williams Ford 10532
;

data two;
  input startrange endrange typeofservice & $35.;
datalines;
3000 5000 oil change
5001 6000 overdue oil change
6001 8000 oil change and tire rotation
8001 9000 overdue oil change
9001 11000 oil change
11001 12000 overdue oil change
12001 14000 oil change and tire rotation
15032 14999 overdue oil change
13001 15999 15000 mile check
;


data combine;
do until (mileage<15000);
  set one;
  do i=1 to nobs;
     set two point=i nobs=nobs;
     if startrange = mileage then
        output;
  end;
  end;

run;


proc print;
run;

Описание кода с сайта поддержки SAS: Прочитайте первое наблюдение из набора данных SAS вне цикла DO. Присвойте переменной FOUND значение 0. Запустите цикл чтения DO, наблюдая из набора данных SAS внутри цикла DO. Обработать условие IF; если условие IF истинно, ВЫХОДИТЕ наблюдение и установите для переменной FOUND значение 1. Присвоение переменной FOUND значения 1 приведет к прекращению обработки цикла DO из-за UNTIL (FOUND), который закодирован в цикле DO. Вернитесь к началу шага DATA и прочитайте следующее наблюдение из набора данных вне цикла DO и повторите процесс через шаг DATA, пока все наблюдения из набора данных вне цикла DO не будут прочитаны.

Ответы [ 3 ]

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

Шаг данных не лучший способ кодировать это.Гораздо проще кодировать нечеткие совпадения с использованием кода SQL.

Не уверен, почему вам нужно иметь нули вместо пропущенных значений, но coalesce() должно облегчить их предоставление.

proc sql ;
  create table combine as
    select a.*
         , coalesce(b.startrange,0) as startrange
         , coalesce(b.endrange,0) as endrange
         , b.typeofservice
    from one a left join two b
    on a.mileage between b.startrange and b.endrange
  ;
quit;
0 голосов
/ 08 апреля 2019

Я не могу использовать proc sql, потому что мне нужен Vlookup внутри цикла UNTIL.Мне нужно другое решение.

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

Вы можете сделать это с помощью LEFT JOIN в процедуре sql

, взяв все переменные из one, затем сделав 2 условия для заполнения startrange и endrange с 0 в случае отсутствия.

proc sql noprint;
    create table want as
    select t1.*
        , case when t2.startrange=. then 0 else t2.startrange end as startrange
        , case when t2.endrange=. then 0 else t2.endrange end as endrange
        , t2.typeofservice
    from one t1 left join two t2
    on (t1.mileage = t2.startrange)
    ;run;quit;

Или сделать это в 2 шага (лично я нахожу if для очистки шага данных, чем case when в proc sql.)

proc sql noprint;
    create table want as select *
    from one t1 left join two t2 on (t1.mileage = t2.startrange)
;run;quit;
data want; set want;
    if startrange=. then do; startrange=0; endrange=0; end;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...