按组检查他们是否符合列表,如果不符合,则创建具有缺失值的新行

check by group if they meet a list and if not, create new rows with missing values

我想按组检查他们是否符合列表,如果不符合,则创建一个包含所有缺失值的新行。如果您不知道 SAS 但知道 SQL Python 或 R,请告诉我。它可以给我一个想法。

例如

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

如果国家/地区不在所有 ('table','chair') 中,则创建包含缺失值的新行。

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

谢谢,

您可以使用 cross join:

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

如果所有值都在table,PROC FREQ 中的SPARSE 是一个不错的小技巧。它本质上强制所有可能值之间的交叉连接。如果您没有 table 某处的所有值,那么您需要一种不同的方法,通常是 PRELOADFMT 选项。

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

proc print data=want;
run;

一个愚蠢的 SAS 选项是将 PROC FREQSPARSE 一起使用。以下是您所要求的:

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;

但是,它不一定适用于其他变量;您必须将其合并到主数据集(或左连接或其他)才能获取其他变量的数据。