在给定组中缺少数据集时向其添加行

时间:2018-05-16 18:51:37

标签: sas

说我有这样的数据集

  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没有销售,因此没有行= day = b和product = 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 :(得分:3)

与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的第一时间做到这一点,不幸的是,我不熟悉那个过程。

答案 1 :(得分:3)

在此特定示例中,您还可以在PROC FREQ中使用SPARSE选项。它告诉SAS使用PRODUCT中包含的DAY中的每个值生成所有完整类型,因此类似于这些元素之间的交叉连接。如果表中没有值,则无法添加该值。在这种情况下你需要一种不同的方法。

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;

答案 2 :(得分:1)

您可以使用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