通过SAS中的合并填补数据空白

时间:2013-02-12 16:33:49

标签: sas

我的数据如下:

id t   x 
1  1  3.7 
1  3  1.2 
1  4  2.4 
2  2  6.0 
2  4  6.1 
2  5  6.2 

对于每个id我想根据需要添加观察值,因此所有1< = t< = 5都有值。

所以我想要的结果是:

id t   x 
1  1  3.7 
1  2  .
1  3  1.2 
1  4  2.4 
1  5  .
2  1  .
2  2  6.0 
2  3  .
2  4  6.1 
2  5  6.2 

我的真实设置涉及大量数据,所以我正在寻找最有效的方法。

3 个答案:

答案 0 :(得分:2)

这可能是最简单的方法,使用PROC SUMMARY中的COMPLETETYPES选项。我假设id和t的组合在数据中是唯一的。 我唯一不确定的是,在针对非常大的数据集运行时是否会遇到内存问题,过去我在这方面遇到过PROC SUMMARY问题。

data have;
input id t x;
cards;
1  1  3.7 
1  3  1.2 
1  4  2.4 
2  2  6.0 
2  4  6.1 
2  5  6.2 
;
run;

proc summary data=have nway completetypes;
class id t;
var x;
output out=want (drop=_:) max=;
run;

答案 1 :(得分:1)

如果您有ETS,一种选择是使用PROC EXPAND。我不确定它是否能达到你想要的100%,但这可能是一个好的开始。似乎到目前为止主要的问题是它不会在开始或结束时做记录,但我认为这是可以克服的;只是不确定如何。

proc expand data=have out=want from=daily method=none extrapolate;
by id;
id t;
run;

对于id 1填写2,对于id 2填写3,但对于id 1填写5或对于id 2不填写。

要在base SAS中执行此操作,您有几个选择。使用SPARSE选项的PROC FREQ可能是个不错的选择。

proc freq data=have noprint;
tables id*t/sparse out=want2(keep=id t);
run;

data want_fin;
merge have want2;
by id t;
run;

您也可以通过PROC SQL执行此操作,并连接到具有可能的t值的表,但这对我来说似乎较慢(即使FREQ方法需要两次传递,FREQ将非常快并且合并正在使用已排序的数据,所以也不会太慢。)

答案 2 :(得分:1)

这是另一种方法,前提是您已经知道T的最小值/最大值。它创建一个包含ID和T的所有值的模板,然后与原始数据集合并,以便保留X的值。 / p>

proc sort data=original_dataset out=template(keep=id) nodupkey;
   by id;
run;

data template;
   set template;
   do t = 1 to 5; /* you could make these macro variables */
      output;
   end;
run;

proc sort data=original_dataset;
   by id t;
run;

data complete_dataset;
   merge template(in=in_template) original_dataset(in=in_original);
   by id t;
   if in_template then output;
run;