我有一个带诊断代码的数据集,每个观察点都有多个诊断代码,最多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开始计数。
这是我昨天写的:
**//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 :(得分: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;
答案 1 :(得分: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;