SAS中SUBSTR函数未按预期工作:提取GEOID10最后6位失败
SAS提取GEOID10最后6位生成TRACTCE变量
我的SAS数据表中有一个变量GEOID10,由10-11位数字组成:前4-5位是州和县的FIPS代码,最后6位是人口普查普查区(Census Tract)。需要创建新变量TRACTCE,仅保留GEOID10的最后6位,去除前4-5位。
部分GEOID10示例:
1001020700 1001020900 1001020900 1001020900 1001020900 1001021000 56035000102 56037970500 56037971600 56037971600 56037971600 56037971600 56037971600
尝试过的错误代码及结果:
- 代码:
data My.Data; set My.Data; TRACTCE = input(substr(GEOID10, 5), 6.); run;
结果:对1001020700返回10207,而非预期的020700。
- 代码:
data My.Data; set My.Data; TRACTCE = input(substr(GEOID10, 5, 6), 6.); run;
结果:对1001020700同样返回10207,而非预期的020700。
- 代码:
data My.Data; set My.Data; TRACTCE = input(substr(GEOID10, 5), 10.); run;
结果:对1001020700返回1020700,而非预期的020700。
- 代码:
data My.Data; set My.Data; TRACTCE = input(compress(substr(GEOID10, 5),, 'kd'), 10.); run;
结果:对1001020700返回1020700,而非预期的020700。
- 代码:
data My.Data; set My.Data; TRACTCE = input(substr(GEOID10, 5, 6), 10.); run;
结果:对1001020700返回10207,而非预期的020700。
- 代码:
data My.Data; set My.Data; TRACTCE = put(input(substr(GEOID10, 5, 6), 10.), z6.); run;
结果:对1001020700返回10207,而非预期的020700。
解决方案
问题核心在于两点:
- 如果
GEOID10是数值型变量,存储时会丢失前导0,无法直接截取得到正确格式; - 固定从第5位截取不适用长度变化的情况,应直接取最后6位。
方案1:将TRACTCE设为字符型(推荐,保留前导0)
先确保GEOID10以完整字符形式处理,再提取最后6位:
/* 若GEOID10是数值型,先转换为11位字符型,补全前导0 */ data My.Data; set My.Data; GEOID10_char = put(GEOID10, z11.); TRACTCE = substr(GEOID10_char, length(GEOID10_char)-5, 6); drop GEOID10_char; run; /* 若GEOID10本身就是字符型,直接提取最后6位 */ data My.Data; set My.Data; TRACTCE = substr(GEOID10, length(GEOID10)-5, 6); run;
方案2:将TRACTCE设为数值型(无前置0,仅当不需要前导0时使用)
data My.Data; set My.Data; GEOID10_char = put(GEOID10, z11.); TRACTCE = input(substr(GEOID10_char, length(GEOID10_char)-5, 6), 6.); drop GEOID10_char; run;
内容的提问来源于stack exchange,提问作者randsakka
相关产品推荐
相关产品推荐

