如何在SAS中提取WR_Name列首个百分号前的数字并生成readings列
在SAS中提取第一个%前的数字到新列
readings 根据你的需求,这里提供几种不同场景下的实现方法:
场景1:第一个%之前的内容以数字开头(或为纯数字)
如果WR_Name的格式类似123%xxx、456abc%yyy,需要提取开头的连续数字部分,可用以下两种简单方法:
方法1:用INDEX+SUBSTR定位截取
data want; set have; * 定位第一个%的位置; perc_position = index(WR_Name, '%'); * 存在%时截取前面的内容并转为数字,否则赋值缺失; if perc_position > 0 then readings = input(substr(WR_Name, 1, perc_position - 1), best32.); else readings = .; drop perc_position; run;
INDEX(WR_Name, '%')返回第一个%的位置,无%则返回0SUBSTR截取从开头到%前一位的字符串,再用INPUT转为数字类型
方法2:用SCAN直接提取分隔前的片段
data want; set have; * 以%为分隔符,提取第一个片段; first_segment = scan(WR_Name, 1, '%'); * 将片段转为数字,无%时自动返回缺失; readings = input(first_segment, best32.); drop first_segment; run;
SCAN(WR_Name, 1, '%')返回第一个%之前的所有字符,无%则返回原字符串INPUT函数读取数字时,会自动提取开头的连续数字,遇到非数字字符停止
场景2:第一个%之前包含非数字开头的数字(如abc789%xyz)
如果需要提取第一个%之前所有数字字符(不管前面有没有非数字),可以用正则表达式实现:
data want; set have; * 正则匹配第一个%之前的数字序列,提取后转为数字; readings = input(prxchange('s/^.*?(\d+).*?%.*$/$1/', 1, WR_Name), best32.); * 处理没有%或没有数字的情况,赋值缺失; if index(WR_Name, '%') = 0 or prxmatch('/\d+.*%/', WR_Name) = 0 then readings = .; run;
- 正则表达式
s/^.*?(\d+).*?%.*$/$1/的作用是:匹配第一个%之前的第一个连续数字序列,并保留该序列 PRXMATCH用于判断是否存在%和数字的组合,避免无匹配时产生错误值
内容的提问来源于stack exchange,提问作者G.Aurelien
相关产品推荐
相关产品推荐

