从sas中的字符值创建数值
我想把像“13232C”这样的代码转换成一个数值。可能为A到Z分配值1到26。那么新代码将是“132323”。如果代码中只有一个字母,则此代码将工作。如果有更多,则需要扫描每一个以获得值。我通过从ASCII值(A=65)中减去64来计算字母值(1-26),确保在必要时将字母转换为大写。我还假设字母总是出现在字符串的末尾从sas中的字符值创建数值,sas,numeric,Sas,Numeric,我想把像“13232C”这样的代码转换成一个数值。可能为A到Z分配值1到26。那么新代码将是“132323”。如果代码中只有一个字母,则此代码将工作。如果有更多,则需要扫描每一个以获得值。我通过从ASCII值(A=65)中减去64来计算字母值(1-26),确保在必要时将字母转换为大写。我还假设字母总是出现在字符串的末尾 data have; input code $; datalines; 132323C 24578D 5147896G ; run; data want; set have;
data have;
input code $;
datalines;
132323C
24578D
5147896G
;
run;
data want;
set have;
new_code=input(cats(compress(code,,'dk'),rank(compress(upcase(code),,'ak'))-64),best12.);
run;
如果代码中只有一个字母,则此代码将起作用。如果有更多,则需要扫描每一个以获得值。我通过从ASCII值(A=65)中减去64来计算字母值(1-26),确保在必要时将字母转换为大写。我还假设字母总是出现在字符串的末尾
data have;
input code $;
datalines;
132323C
24578D
5147896G
;
run;
data want;
set have;
new_code=input(cats(compress(code,,'dk'),rank(compress(upcase(code),,'ak'))-64),best12.);
run;
Keith的解决方案在大多数情况下可能更好,但我忍不住认为这是使用PROC FCMP(函数编译)的好机会。这在只有A-I的情况下非常有效;从J开始,它将不起作用,因为我只允许单个角色的空间。如果它可以有两个数字,则需要更改FCMP以执行Keith的解决方案所做的操作
proc fcmp outlib=work.funcs.trial;
function cton(charvar $) $;
do n = 1 to length(charvar);
if 48 le rank(char(charvar,n)) le 57 then ;
else substr(charvar,n,1) = put(rank(upcase(char(charvar,n)))-64,1.);
put charvar;
end;
return (charvar);
endsub;
quit;
options cmplib=work.funcs;
data test;
x="23456CAB";
y = cton(x);
put x= y=;
run;
我还将其作为字符返回,但这并不重要-如果您愿意,可以将其作为数字返回(我在原始问题中看到了“”。基思的解决方案对于大多数用途来说可能更好,但我忍不住认为这是使用PROC FCMP(函数编译)的好机会。这在只有A-I的情况下非常有效;从J开始,它将不起作用,因为我只允许单个角色的空间。如果它可以有两个数字,则需要更改FCMP以执行Keith的解决方案所做的操作
proc fcmp outlib=work.funcs.trial;
function cton(charvar $) $;
do n = 1 to length(charvar);
if 48 le rank(char(charvar,n)) le 57 then ;
else substr(charvar,n,1) = put(rank(upcase(char(charvar,n)))-64,1.);
put charvar;
end;
return (charvar);
endsub;
quit;
options cmplib=work.funcs;
data test;
x="23456CAB";
y = cton(x);
put x= y=;
run;
我还将其作为字符返回,但这并不重要-如果您愿意,可以将其作为数字返回(我在原始问题中看到了“”).是否总是只有一个字符值?是否总是只有一个字符值?我可能应该补充一点,如果需要引用从字母计算出的数字,您可能希望将新变量保留为字符。这只有在原始字符串是固定长度时才可能,在我的示例中,我使用了可变长度。希望我已经给了你足够的方法来支持你的修改。很好的解决方案。非常优雅。我应该补充一点,如果您需要引用根据字母计算的数字,您可能希望将新变量保留为字符。这只有在原始字符串是固定长度时才可能,在我的示例中,我使用了可变长度。希望我已经给了你足够的方法来支持你的修改。很好的解决方案。非常优雅。