我的数据如下:
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
我的真实设置涉及大量数据,所以我正在寻找最有效的方法。
答案 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;