You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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, '%')返回第一个%的位置,无%则返回0
  • SUBSTR截取从开头到%前一位的字符串,再用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 09:10:32