SAS:IF语句中的通配符

时间:2018-06-13 14:50:48

标签: sas

我有一个带有患者诊断代码的数据集,我需要使用通配符来对他们的诊断进行分类。

patientID diagnosis cancer age gender 
1         250.0      0     65    M     
1         250.00     1     65    M     
2         250.01     1     23    M     
2         250.02     0     23    M     
3         250.11     0     50    F     
3         250.12     0     50    F
4.        513.01.    1     34    M

第5个字符为0或2的诊断需要归类为2型糖尿病,而以1和3结尾的诊断需要归类为1型糖尿病。但是,250.0只有4个字符,需要归类为类型2.

这在数据步骤中不起作用

if diagnosis_code ='250.%0' then t2dm = 1;
if diagnosis_code ='250.%1' then t1dm = 1;

2 个答案:

答案 0 :(得分:2)

该测试不需要通配符。使用冒号修饰符测试代码前缀和substr()函数来测试第6个字符(第5个数字)。

if diagnosis_code='250.0' or
 (diagnosis_code=:'250.' and substr(diagnosis_code,6)='0') then t2dm = 1;
if diagnosis_code=:'250.' and substr(diagnosis_code,6)='1' then t1dm = 1;

答案 1 :(得分:1)

如果可以使用PRXMATCH函数完成语句,则DATA步骤中的通配符匹配。 PRX表示Perl正则表达式。

PRXMATCH ( 正则表达式模式 , 文本到评估 )

PRXMATCH Function文档

示例数据

data have; input
patientID diagnosis_code $ cancer age gender $; datalines;
1         250.0      0     65    M     
1         250.00     1     65    M     
2         250.01     1     23    M     
2         250.02     0     23    M     
3         250.11     0     50    F     
3         250.12     0     50    F
4.        513.01.    1     34    M
run;

示例代码

data want;
  set have;
  t2dm = prxmatch('/^250\.\d*0$/', trim(diagnosis_code)) > 0;
  t1dm = prxmatch('/^250\.\d*1$/', trim(diagnosis_code)) > 0;
run;

示例代码的注释

  • /限制正则表达式
  • ^在开头匹配
  • 250匹配250
  • \.匹配实际期间
  • \d匹配一个数字
    • \d*匹配零个或多个数字
  • 0 1匹配0或1
    • 0$ 1$匹配最后的0或1
  • trim()修剪文本以进行评估,以便最后的匹配工作
  • > 0匹配将在文本中返回 p 位置,如果不匹配则返回0, p > 0将逻辑评估为0或1并分配给标志变量