Как объединить два кадра данных, основанные на условиях, без общей переменной? - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь воссоздать следующий код SAS в R

PROC SQL;
    create table counts_2018 as 
    select a.*, b.cell_no 
    from work.universe201808 a, work.selpar17 b 
    where a.newregionxx = b.lower_region2 
      and a.froempment >= b.lower_size 
      and a.froempment <= b.upper_size 
      and a.frosic07_2 >= b.lower_class2 
      and a.frosic07_2 <= b.upper_class2;
QUIT;

По сути это означает, что cell_no , найденный в selpar17 , дляданные в universe201808 , основанные на выполнении всех 6 условий , указанных в коде.Данные, которые не удовлетворяют этим условиям и, следовательно, не будут иметь cell_no , назначенные для них, не включены в финальную таблицу.

Документация / ответы, которые я нашел до сих пор, всеначните с шага, где два кадра данных объединяются общей переменной, затем выполняется sqldf select.У меня нет общего столбца, и поэтому я не могу объединить свои фреймы данных.

1 Ответ

0 голосов
/ 18 декабря 2018

В настоящее время вы используете неявное объединение двух таблиц, что не рекомендуется в SQL.В соответствии с ANSI-1992 (спецификация 25+ лет), согласно которому явный JOIN является стандартным способом объединения отношений, рассмотрите возможность надлежащего пересмотра SQL-запроса.

Вопреки вашему утверждению, у вас на самом деле do есть общий столбец между таблицами, как показано в вашем условии равенства: a.newregionxx = b.lower_region2, которое может служить условием JOIN.Даже для краткости используйте оператор BETWEEN:

new_df <- sqldf('select u.*, s.cell_no 
                 from universe201808 u
                 inner join selpar17 s 
                         on u.newregionxx = s.lower_region2 
                 where u.froempment between s.lower_size and s.upper_size 
                   and u.frosic07_2 between s.lower_class2 and s.upper_class2')

Фактически, вы можете удалить where в целом и поместить все в предложение on:

...
on u.newregionxx = s.lower_region2 
and u.froempment between s.lower_size and s.upper_size 
and u.frosic07_2 between s.lower_class2 and s.upper_class2
...