2011-08-16 108 views
1

我的數據集有兩個變量ID和診斷。我試圖根據ID和診斷在我的數據集中分配行號。在sas中的proc排名

我使用的代碼是;

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

proc rank data = temp out = temp1; 
by id; 
var diagnosis; 
ranks = diag_rank; 
run; 

它給先生的錯誤:在列表中的變量診斷不匹配的類型

我知道我的診斷有文字和numric值。有沒有辦法來解決這個問題。非常感謝。

回答

3

如果您只是尋找一個唯一的行號,那麼以下應該工作。

data temp; 
    set temp; 
    retain row_number 0; 
    row_number + 1; 
run; 

如果您需要根據ID和診斷條件的行號,然後嘗試:

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

如果,另一方面,有排名,你想強加給一些明令DIAGNOSIS變量除了排序的字符值以外,那麼您可以使用用戶定義的格式將每個字符值映射到一個數字,然後使用該格式在數據步驟中創建一個row_number變量,如下所示。

proc format; 
    value $diag_row 
    "67" = 2 
    "A234" = 4 
    "B45" = 3 
    "V456" = 1 
    other = 999 
    ; 
run; 

data temp; 
    set temp; 
    format row_number 8.0; 
    row_number = put(diagnosis,$diag_row.); 
run; 
+0

謝謝RWill。你太棒了。有效 :) – Nupur

0

Nupur,VAR語句只需要數字變量。如果DIAGNOSIS被定義爲字符,但只包含數字值,則使用INFORMAT語句創建一個新的數字變量。以下添加到您的示例的開始,它應該工作:

data temp; 
    set temp(rename=(diagnosis=diag_char)); 
    format diagnosis 8.0; 
    diagnosis = input(diag_char , 8.0); 
    drop diag_char; 
run; 

但是,如果你的診斷包括字符值,那麼你要麼需要重新分類診斷或可能翻譯值數值(如果它說得通)。

+0

嗨RWill,感謝您的答覆。我的診斷具有V456,A234,67,B45等值。我既不能將其轉換爲字符或變量。有沒有辦法解決這個問題? – Nupur

0

如果您只是想使用行號,您可以使用默認變量「_ N_」,不帶引號和空格。

如果是有條件的,你可以按照Rwill的答案..