2011-08-16 61 views
0

我有一個包含變量ID和診斷的數據集。我想根據ID將序列號分配給診斷。 例如:如果ID 1有5個診斷,我希望序列號是(1,2,3,4,5),然後如果ID 2有3個診斷,序列號將是(1,2,3)和等等。將序列號分配給SAS中的觀察值

有沒有辦法在SAS中做到這一點? 非常感謝。

嗨非常感謝您的回覆。我真的想要這樣。

Obs diagnosis  id diagnosis_serial_number 

1  XX    1 1 
2  XX1   1 2 
3  XX2   1 3 
4  XX3   1 4 
5  XX4   1 5 
6  XX    2 1 
7  XX1   2 2 
8  XX2   2 3 
+0

您是否想知道如何將列添加到SAS數據集? –

+0

是的,一列有診斷序列號。例如:一些像diag_serial_number這樣的列,它具有用於根據不同ID號進行診斷的序列號。 – Nupur

回答

0

Nupur,如果你需要爲每一個診斷的序列號,然後嘗試以下方法:

proc sort data=temp; 
    by id diagnosis; 
run; 

data temp_serial_number; 
    set temp; 
    by id diagnosis; 
    format diagnosis_serial_number $30.; 
    retain diagnosis_serial_number count; 
    if first.id then do; 
     count = 0; 
     diagnosis_serial_number = "("; 
    end; 
    count + 1; 
    diagnosis_serial_number = trim(left(diagnosis_serial_number)) || trim(left(count)); 
    if last.id then do; 
     diagnosis_serial_number = trim(left(diagnosis_serial_number)) || ")"; 
     output; 
    end; 
    else do; 
     diagnosis_serial_number = trim(left(diagnosis_serial_number)) || ","; 
    end; 
    drop diagnosis count; 
run; 

data temp; 
    merge temp(in=in_temp) temp_serial_number(in=in_serial_nbr); 
    by id; 
    if in_temp then output; 
run; 

proc print data=temp; 
run; 

輸出將如下所示:

Obs diagnosis  id diagnosis_serial_number 

1  XX    1 (1,2,3,4,5) 
2  XX1   1 (1,2,3,4,5) 
3  XX2   1 (1,2,3,4,5) 
4  XX3   1 (1,2,3,4,5) 
5  XX4   1 (1,2,3,4,5) 
6  XX    2 (1,2,3) 
7  XX1   2 (1,2,3) 
8  XX2   2 (1,2,3) 
+0

@嗨RWill,我剛剛在我最初的問題中做了一個表,我想如何看待它。謝謝你的時間。 – Nupur

2

我有點不清楚你究竟在問什麼,但我認爲這可能會有訣竅。它使用一個保留語句和一個遞增步驟來創建一個稱爲serial的計數器變量,並在每次找到新的ID組時使用組處理來重置計數器。

請注意,在使用此代碼之前,您的輸入數據集(此處稱爲input_ds)必須先按ID排序。

data output_ds; 
    retain serial; 
    set input_ds; 
    by ID; 
    if first.ID then serial = 0; 
    serial = serial + 1; 
run; 
1

Nupur,得到你剛剛描述的輸出,然後試試這個:

proc sort data=temp; 
    by id diagnosis; 
run; 

data temp; 
    set temp; 
    by id diagnosis; 
    retain diagnosis_serial_number 0; 
    if first.id then do; 
     diagnosis_serial_number = 0; 
    end; 
    diagnosis_serial_number + 1; 
run;