2011-07-11 29 views
3

假设我有一个SAS数据集,看起来像这样:设置的重复数据集在SAS数据步

id x 
1 1234 
2 2345 
3 3456 

我需要的是在(说)2次读取该数据集的新数据集,以指示一个新的变量,其“复制”是这样的:

id x  rep 
1 1234 1 
2 2345 1 
3 3456 1 
1 1234 2 
2 2345 2 
3 3456 2 

重要的是,该数据以这样的准确顺序读 - 整个初始数据集被读出一次,然后再等

任何关于效率的想法在数据步骤中做到这一点的方法? (实际上,我的数据集很大,我需要多次阅读,而且我想避免排序。)

我试过了,但新数据集中的观察顺序并不是我想要的:

data foo; 
set tmp; rep=1; output; 
set tmp; rep=2; output; 
run; 

回答

8

如果你想保持数据的一步,那么这将工作,如你所述。

data foo; 
    set tmp (in=INA) tmp (in=INB); 
    if INA then REP=1; 
    if INB then REP=2; 
run; 
0

你可以尝试使用视图和PROC追加像这样:

/* create view for rep=2 */ 

data rep2/view=rep2; 
set tmp; 
rep = 2; 
run; 

/* create dataset for rep=1 */ 

data foo; 
set tmp; 
rep = 1; 
run; 

/* append rep=2 to rep=1 dataset */ 

proc append base=foo data=rep2; 
run; 
1
data rep; 
    set tmp; 

    do rep = 1 to 2; /* or 3, or whatever */ 
    output; 
    end; 
proc sort; 
    by rep id; 
run; 

就是这样。

+0

谢谢,我试图避免排序。 – itzy

+0

我想知道,为什么?您是否尝试保留原始记录订单(超出ID)或有一些性能考虑因素? – Anton

+1

这是一个巨大的文件,排序大约需要20分钟。我需要做这个数千次,所以你是对的,这是关于性能。 – itzy