2016-04-22 139 views
0

我有一個診斷代碼的數據集,每個觀察有多個診斷代碼,最多95個(變量dx1-dx95),一些dx代碼是數字但有些是e代碼(它們在數字之前有一個E,然後它們變成字符變量)。我需要編寫能夠查看所有95個dx代碼變量的代碼,並在每次有e代碼時生成新的變量ecode1-ecode#(但是在那個觀察中有很多ecode)。例如,一個觀察可能有dx1 = 999 dx2 = E100 dx3 = 878,dx4 = E202,我需要做出新的變量ecode1 = E100 ecode2 = 202。我昨天寫的代碼讓我接近了,但是我寫的代碼使上面的例子ecode2 = E100 ecode4 = E202。 ecode變量#結束與dx#相同,而不是從1開始計數。SAS使用數組搜索變量,然後填充新變量

下面是昨天我寫的:

**//array to pull out ecodes from dx1-dx95//**; 
data ecodes; 
set injurycodes; 
*array to create new ecode variables; 
array ecode{95}$ ecode1-ecode95; 
*array to pull out ecodes; 
array dxcode{95} dx1-dx95; 
do i=1 to 95; 
if 'E0000' le dxcode{i} le 'E9999' then ecode{i}=dxcode{i}; 
end; 
drop i; 
run; 

我知道現在的問題是ECODE {I} = {dxcode I}片。這是拉出Ecodes,但它們不與ecode1,ecode2等開始

更新代碼:

data ecodes; 
set injurycodes; 
array ecode{95}$ ecode1-ecode95; 
array dxcode{95} dx1-dx95; 
j=0; 
DO i=1 TO 95; 
    IF SUBSTR(CATT(dxcode{i}),1,1)="E" THEN DO; 
    ecode{j}=dxcode{i}; 
    j=j+1; 
    END; 
END; 
run; 

現在我得到「無效的第二個參數的功能SUBSTR」

+0

DX代碼幾乎總是作爲字符存儲,爲什麼你想要數字的代碼? – Reeza

回答

0

只需用SUBSTR檢查dxcode的第一個字符,然後使用j循環ecode。

j=0; 
DO i=1 TO 95; 
    IF SUBSTR(CATT(dxcode{i}),1,1)="E" THEN DO; 
    ecode{j}=dxcode{i}; 
    j=j+1; 
    END; 
END; 
+0

感謝您的提示,但我不想擺脫E.我基本上想看看所有95 dxcodes,並拉出所有以E開頭的(保持E在代碼前面)和創建一組新的ecode變量,其中包含那些具有E. – user6241156

+0

OK的dxcode變量。看到我的更新。 – Jfly

+0

我收到了「對功能SUBSTR無效的第二個參數」。將發佈新代碼。 – user6241156

0

你的主要問題是你需要保持一個單獨的計數器變量來使用索引到輸出數組。

data ecodes; 
    set injurycodes; 
    array ecode(95) $5; 
    array dx (95) ; 
    j=1; 
    do i=1 to dim(dx); 
    if dx(i)=:'E' then do; 
     ecode(j) = dx(i); 
     j=j+1; 
    end; 
    end; 
    drop i j; 
run;