说我有这样的数据集
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中的自联接实现这一点,但我想知道是否有一个程序。
答案 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