Нужно предложение о том, как объединить наборы данных с одинаковым, но не идентичным идентификатором соединения - PullRequest
0 голосов
/ 16 февраля 2019

Итак, у меня есть набор данных, в котором каждый город и штат находятся в одном столбце.Другой набор данных также содержит город и штат в одном столбце, НО некоторые города объединены.Например:

Набор данных 1 будет иметь:

CITY STATE          POPULATION
Cape Coral Fl       1000000    
Fort Myers FL       2000000    
Gainesville FL      100000

Набор данных 2 будет иметь:

CITY STATE                    EMPLOYMENT    
Cape Coral - Fort Myers FL    900    
Gainesville FL                1000

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

Я надеюсь, что есть более простое решение, о котором я не думализ.Я пошел дальше и сделал традиционное слияние по ГОРОДУ, но оно соответствовало только половине моего набора данных.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Делая некоторые предположения, это решение могло бы работать:

data a;
  length city_state $100;
  input CITY_STATE & POPULATION;
  datalines;
  Cape Coral Fl       1000000    
  Fort Myers FL       2000000    
  Gainesville FL      100000
run;

data  b;
  length city_state $100;
  input CITY_STATE & EMPLOYMENT;
  datalines;
  Cape Coral - Fort Myers FL    900    
  Gainesville FL                1000
Run;

Proc sql;
select a.city_state, b.city_state, a.population, case when b.city_state contains '-' then b.EMPLOYMENT /2 else b.EMPLOYMENT End as EMPLOYMENT from a
 inner join b 
on b.city_state contains substr(a.city_state,1,length(a.city_state)-length(scan(a.city_state,-1,' ')));
quit;

результат:

city_state     | city_state                 |POPULATION |EMPLOYMENT 
------------------------------------------------------------------------
Cape Coral Fl  | Cape Coral - Fort Myers FL | 1000000   |  450 
Fort Myers FL  | Cape Coral - Fort Myers FL | 2000000   |  450 
Gainesville FL | Gainesville FL             | 100000    | 1000 

Предполагая, что каждое city_state с a - включает в себя два города, вы можете наполовину его

случай, когда b.city_state содержит '-', затем b.EMPLOYMENT / 2 else b.EMPLOYMENT End as EMPLOYMENT

Предполагая, что каждое city_state заканчивается коротким состоянием, вы можете удалить состояниеи выполните оператор содержит:

b.city_state содержит substr (a.city_state, 1, length (a.city_state) -length (scan (a.city_state, -1, ''))));

0 голосов
/ 16 февраля 2019

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

data two;
  length city_state $100;
  input CITY_STATE & EMPLOYMENT;
datalines;
Cape Coral - Fort Myers FL    900    
Gainesville FL                1000
run;

data two_b;
  length city_state_item $100;
  set two;
  state = scan (city_state, -1, ' ');
  p = find (city_state, trim(state), -101);
  city_state_base = substr(city_state,1,p-1);
  do _n_ = 1 by 1 while (scan(city_state_base,_n_,'-') ne '');
    city_state_item = catx (' ', scan(city_state_base,_n_,'-'), state);
    OUTPUT;
    employment = 0;
  end;
  drop p city_state_base state;
run;

После разделения васпридется сопоставить ONE.city_state с TWO_B.city_state_item и определить, как будет делиться или не разделяться занятость, в зависимости от того, как сопоставленные данные реагрегируются или используются для вычисления соотношения занятости и населения.

...