2016-07-27 12 views
1

IDがすでに割り当てられているデータセットに基づいて現在利用可能な一連のID番号を要約する必要があります(IDがファイル上に存在し、使用中であれば...ファイルにない場合は使用可能です)使用のために)。SAS個々の観測値に欠損値を作成します。

問題は、私は、ファイルに現在ある2つのID# 'sの間にある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」のシナリオになります...

私の最初の試みは、違いを見つけるために1つの観測から次の観測に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の答えに基づいて作成:もう1つの方法は、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

関連する問題