提问人:randsakka 提问时间:11/14/2023 最后编辑:Richardrandsakka 更新时间:11/21/2023 访问量:38
SAS 中的 Substr 命令无法正常工作
Substr command in SAS not working how it's supposed to
问:
我的 SAS 表中有一个名为 GEOID10 的变量,它由 10-11 位数字组成。前 4-5 位数字是州和县 FIPS 代码,最后 6 位数字是人口普查区。我想创建一个名为 TACTCE 的新变量,它只取GEOID10的最后 6 位数字,并删除前 4-5 位数字。
以下是我正在使用的 GEOID10 的一些示例:
1001020700
1001020900
1001020900
1001020900
1001020900
1001021000
56035000102
56037970500
56037971600
56037971600
56037971600
56037971600
56037971600
我在SAS中尝试了以下代码,但是它从未以正确的数字开始。
data My.Data;
set My.Data;
TRACTCE = input(substr(GEOID10, 5), 6.);
run;
这个代码给了我 10207 而不是 020700 GEOID10 1001020700。
data My.Data;
set My.Data;
TRACTCE = input(substr(GEOID10, 5, 6), 6.);
run;
这段代码还给了我 10207 而不是 020700 GEOID10 1001020700。
data My.Data;
set My.Data;
TRACTCE = input(substr(GEOID10, 5), 10.);
run;
此代码还给了我 1020700 而不是 020700 GEOID10 1001020700。
data My.Data;
set My.Data;
TRACTCE = input(compress(substr(GEOID10, 5),, 'kd'), 10.);
run;
此代码还给了我 1020700 而不是 020700 GEOID10 1001020700。
data My.Data;
set My.Data;
TRACTCE = input(substr(GEOID10, 5, 6), 10.);
run;
这段代码还给了我 10207 而不是 020700 GEOID10 1001020700。
data My.Data;
set My.Data;
TRACTCE = put(input(substr(GEOID10, 5, 6), 10.), z6.);
run;
这段代码还给了我 10207 而不是 020700 GEOID10 1001020700。
答:
我无法从您分享的内容中分辨出您的字符串实际上包含什么。
但是根据您的第一个结果,我将假设第一个数字 1 出现在第二个位置。这意味着第二个数字 1 位于第 5 位。
23 data test;
24 GEOID10=' 1001020700';
25 TRACTCE = input(substr(GEOID10, 5), 6.);
26 put GEOID10 = $quote. TRACTCE= comma12. ;
27 run;
GEOID10=" 1001020700" TRACTCE=102,070
如果您想将 10 或 11 字节的字符串拆分为最后 6 个字节和其余部分,那么您可以使用 LENGTH() 函数找到最后一个非空白字符的位置并减去 5。
68 data test;
69 length geoid10 $11 left $5 right $6;
70 GEOID10= '1001020700';
71 loc = length(geoid10)-5;
72 left = substrn(geoid10,1,loc-1);
73 right = substrn(geoid10,loc);
74 format _character_ $quote.;
75 put (_all_) (=);
76 run;
geoid10="1001020700" left="1001" right="020700" loc=5
如果 GEOID10 是 NUMERIC,则不要在其上使用字符函数。只需使用算术即可。
61 data test;
62 GEOID10= 1001020700;
63 right = mod(geoid10,10**6);
64 left = int(geoid10/10**6);
65 format geoid10 Z11. right z6. left Z5.;
66 put (_all_) (=);
67 run;
GEOID10=01001020700 right=020700 left=01001
好吧,您好,您能否使用以下更改运行代码,如果还有其他事情,请告诉我,好吗?
first_four=substr(string_variable, -1, 6);
或
last_three = substr(string_variable, length(string_variable)-2, 3);
run;
它将从末尾(从右到左)读取这些值,您可以根据需要调整“到”值。默认情况下,变量的值从左到右取,而 buffer 的填充。
评论