проверьте по группам, соответствуют ли они списку, и если нет, создайте новые строки с отсутствующими значениями

#sql #sas

Вопрос:

Я хочу проверить по группам, соответствуют ли они списку, и если нет, создайте новую строку со всеми отсутствующими значениями. Если вы не знаете в SAS, но знаете в SQL Python или R, пожалуйста, дайте мне знать. Это может навести меня на мысль.

напр..

 COUNTRY  OBJECT
U.S       table
U.S.      chair
France    chair
 

если страна не во всех («таблица», «стул»), то создайте новую строку с отсутствующим значением.

 COUNTRY  OBJECT
U.S       table
U.S.      chair
France    chair
France    table
 

Спасибо,

Ответ №1:

Вы можете использовать cross join :

 select c.country, o.object
from (select distinct country from t) c cross join
     (select distinct object from t) o;
 

Ответ №2:

Если все значения указаны в таблице, РАЗРЕЖЕННОСТЬ в PROC FREQ-это приятная маленькая хитрость. Это, по сути, приводит к перекрестному соединению всех возможных значений. Если у вас где-то нет всех значений в таблице, вам нужен другой подход, обычно опция предварительной загрузки.

 proc freq data=have;
table country*object / sparse list out=want;
run;

proc print data=want;
run;
 

Ответ №3:

Один из идиотских вариантов SAS-использовать PROC FREQ с SPARSE . Приведенное ниже делает то, о чем вы просите:

 data have;
input COUNTRY  $ OBJECT $;
datalines;
U.S.      table
U.S.      chair
France    chair
;;;;
run;

proc freq data=have;
  tables country*object/sparse out=want(keep=country object);
run;
 

Однако это не обязательно будет работать с другими переменными; вам придется объединить их с основным набором данных (или левым соединением или чем-то еще), чтобы получить данные других переменных.