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

基于Base SAS 9.2 SUBSTR函数实现邮政编码按前三位分区域

在Base SAS中处理邮政编码区域划分的方案

嗨,我来帮你搞定这个问题!咱们分两步走:先提取邮政编码的前三位数字,再基于这些数字映射到对应的区域。下面针对不同场景给出具体的实现方法:

一、提取邮政编码的前三位数字

SAS里邮政编码可能存成字符型或者数值型,处理方式略有不同,分别来看:

1. 若邮政编码是字符型变量(比如叫zip_char)

直接用substr()函数截取前3个字符就好,这个方法最稳妥,还能保留前导零(比如邮编01234的前三位是012,不会丢失):

data zip_processed;
    set your_dataset; /* 替换成你的数据集名 */
    zip_prefix = substr(zip_char, 1, 3); /* 从第1位开始,截取3个字符 */
run;

2. 若邮政编码是数值型变量(比如叫zip_num)

数值型邮编容易丢失前导零(比如01234存成数值就是1234),所以建议先转成字符型再截取,避免出错:

data zip_processed;
    set your_dataset;
    /* 用put函数转成字符,$5.格式适配5位邮编,长度不够可以调整 */
    zip_char = put(zip_num, $5.);
    zip_prefix = substr(zip_char, 1, 3);
run;

要是你确定所有邮编都没有前导零,也可以用数值运算直接取前三位(比如12345取123):

zip_prefix_num = floor(zip_num / 100); /* 除以100后取整,得到前三位数值 */

二、基于前三位划分区域

这里有两种常用方法,你可以根据需求选:

方法1:IF-ELSE条件语句

适合逻辑简单、需要灵活调整的场景,直接对提取的zip_prefix做判断:

data zip_regions;
    set zip_processed;
    length region $10; /* 提前定义区域变量的长度,避免截断 */
    if zip_prefix in ('350', '351', '352') then region = 'central';
    else if zip_prefix in ('360', '361', '362', '368') then region = 'east';
    /* 可以继续添加其他区域的判断规则 */
    else region = 'other'; /* 处理所有未匹配的邮编 */
run;

方法2:自定义格式(FORMAT)

如果这个区域映射规则需要重复使用,自定义格式会更高效,后续直接调用就行:

/* 第一步:创建自定义格式 */
proc format;
    value $zip_region
        '350', '351', '352' = 'central'
        '360', '361', '362', '368' = 'east'
        other = 'other';
run;

/* 第二步:把格式应用到前缀变量上 */
data zip_regions;
    set zip_processed;
    region = put(zip_prefix, $zip_region.); /* 用put函数生成区域变量 */
run;

要是你用的是数值型前缀,就把格式定义改成value zip_region(去掉$),对应数值列表即可。

小提醒

  • 优先把邮编转成字符型处理,避免前导零丢失导致区域划分错误;
  • 可以先检查zip_prefix的取值,比如用length(zip_prefix) ne 3筛选出长度不足3位的异常邮编,提前处理。

内容的提问来源于stack exchange,提问作者KS Alabama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:51:47