2016-04-22 104 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;