Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从sas中的字符值创建数值_Sas_Numeric - Fatal编程技术网

从sas中的字符值创建数值

从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;

我想把像“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;
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;

我还将其作为字符返回,但这并不重要-如果您愿意,可以将其作为数字返回(我在原始问题中看到了“”).

是否总是只有一个字符值?是否总是只有一个字符值?我可能应该补充一点,如果需要引用从字母计算出的数字,您可能希望将新变量保留为字符。这只有在原始字符串是固定长度时才可能,在我的示例中,我使用了可变长度。希望我已经给了你足够的方法来支持你的修改。很好的解决方案。非常优雅。我应该补充一点,如果您需要引用根据字母计算的数字,您可能希望将新变量保留为字符。这只有在原始字符串是固定长度时才可能,在我的示例中,我使用了可变长度。希望我已经给了你足够的方法来支持你的修改。很好的解决方案。非常优雅。