Добавление строк в набор данных, если они отсутствуют в данной группе - PullRequest
0 голосов
/ 16 мая 2018

Скажем, у меня есть такой набор данных

  day product sales
1   a       1    48
2   a       2    55
3   a       3    88
4   b       2    33
5   b       3    87
6   c       1    97
7   c       2    95

В день "b" не было продаж для продукта 1, поэтому нет строки, где день = b и продукт = 1. Есть ли простойспособ добавить строку с day = b, product = 1 и sales = 0 и аналогичными «пропущенными» строками, чтобы получить такой набор данных?

  day product sales
1   a       1    48
2   a       2    55
3   a       3    88
4   b       1     0
5   b       2    33
6   b       3    87
7   c       1    97
8   c       2    95
9   c       3     0

В R вы можете сделать complete(df, day, product, fill = list(sales = 0)).Я понимаю, что вы можете сделать это с помощью самостоятельного соединения в proc sql, но мне интересно, есть ли для этого процедура.

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

В этом конкретном примере вы также можете использовать опцию SPARSE в PROC FREQ. Он говорит SAS генерировать все полные типы с каждым значением из ДНЯ, включенным в PRODUCT, так что это похоже на перекрестное соединение между этими элементами. Если у вас нет значения в таблице, он не может добавить значение. В этом случае вам потребуется другой метод.

data have;
input n day $ product sales;
datalines;
1   a       1    48
2   a       2    55
3   a       3    88
4   b       2    33
5   b       3    87
6   c       1    97
7   c       2    95
;;;;
run;

proc freq data=have noprint;
table day*product / out=want sparse;
weight sales;
run;

proc print data=want;run;
0 голосов
/ 16 мая 2018

Вы можете сделать это с помощью proc freq, используя опцию sparse.

Код:

proc freq data=have noprint;
table day*product /sparse out=freq (drop=percent);
run;

Выход:

 day=a product=1 COUNT=1 
 day=a product=2 COUNT=1 
 day=a product=3 COUNT=1 
 day=b product=1 COUNT=0 
 day=b product=2 COUNT=1 
 day=b product=3 COUNT=1 
 day=c product=1 COUNT=1 
 day=c product=2 COUNT=1 
 day=c product=3 COUNT=0 
0 голосов
/ 16 мая 2018

Как обычно в SAS, существует около десятка способов сделать это.Вот мой любимый.

data have;
input n day $ product sales;
datalines;
1   a       1    48
2   a       2    55
3   a       3    88
4   b       2    33
5   b       3    87
6   c       1    97
7   c       2    95
;;;;
run;

proc means data=have completetypes;
  class day product;
  types day*product;
  var sales;
  output out=want sum=;
run;

completetypes говорит SAS выставлять строки для каждой комбинации классов, включая отсутствующие.Затем вы можете использовать proc stdize, чтобы получить 0 (если вам нужно, чтобы они были 0).Возможно, вы могли бы сделать это в первую очередь с помощью proc stdize, я, к сожалению, не так знаком с этим процессом.

...