2016-07-27 52 views
1

我需要概述一系列當前可用的身份證號碼,這些身份證號碼基於已經分配了身份證號碼的數據集(如果身份證件位於該文件上,那麼正在使用該身份證件;如果身份證件不在文件中,則可用身份證件用來)。SAS創建缺少的數字ID到個人觀察。

問題是我不知道如何創建顯示ID號這兩個編號的是目前的文件之間的數據集 - 可以說我有下面的數據集 -

data have; 
input id; 
datalines; 
1 
5 
6 
10 
; 
run; 

我需要的是新的數據集在這組數據的結構如下 -

data need; 
input id; 
datalines; 
2 
3 
4 
7 
8 
9 
; 
run; 

我不知道我怎麼會產生的觀察ID#的2,3和4這些將是「可用ID」的情景...

我最初的嘗試是將一個觀測值的ID值減去下一個值,以便找到差值,但是我從那裏得到了關於如何使用該值並在觀測值之前加上1的信息......並且這一切都變得相當混亂。

任何援助將不勝感激。

回答

1

只要您可能的ID集合已知,可以將它們全部放在一個文件中並排除舊文件。 例如

data id_set; 
do id = 1 to 10; 
    output; 
end; 
run; 

proc sql; 
create table need as 
    select id 
     from id_set 
      where id not in (select id from have) 
    ; 
quit; 
+0

好又簡單......謝謝! – SMW

0

建立在Jetzler的答案:另一種選擇是使用MERGE語句。在這種情況下:

注意:合併之前,按id排序兩個數據集(如果尚未排序);

data want; 
    merge id_set (in=a) 
      have (in=b); /*specify datasets and vars to allow the conditional below*/ 
    by id; /*merge key variable*/ 
    if a and not b; /*on output keep only records in ID_SET that are not in HAVE*/ 
run; 
1

創建存儲先前ID,則只是之間以及電流id循環,輸出每個迭代一個臨時變量。

data have; 
input id; 
datalines; 
1 
5 
6 
10 
; 
run; 

data need (rename=(newid=id)); 
set have; 
retain _lastid; /* keep previous id value */ 
if _n_>1 then do newid=_lastid+1 to id-1; /* fill in numbers between previous and current ids */ 
output; 
end; 
_lastid=id; 
keep newid; 
run; 
+0

我應該考慮保留...然後數......很好有一個功能版本的概念。爲你+1 ... – SMW