SAS创建新变量,该变量是现有变量的第一位数字

SAS创建新变量,该变量是现有变量的第一位数字,sas,Sas,我正在编写SAS代码,遇到了一个问题。我试图用体重和身高来计算6000多名患者的BMI(所以数据线不是一个选项)。对于每个obs,高度当前输入为508(5英尺)、08英寸等。所以我想我会尝试将substr和input语句结合起来,从3位代码中提取第一位数字,然后对英寸执行同样的操作。当我有了这两个新变量后,我就可以做剩下的事情了,但我似乎无法让这个特定的数据步骤起作用 这就是我所拥有的: data work.bmi_prep; set work.fixedmissing; HEIGHTFT=in

我正在编写SAS代码,遇到了一个问题。我试图用体重和身高来计算6000多名患者的BMI(所以数据线不是一个选项)。对于每个obs,高度当前输入为508(5英尺)、08英寸等。所以我想我会尝试将substr和input语句结合起来,从3位代码中提取第一位数字,然后对英寸执行同样的操作。当我有了这两个新变量后,我就可以做剩下的事情了,但我似乎无法让这个特定的数据步骤起作用

这就是我所拥有的:

data work.bmi_prep;
set work.fixedmissing;
HEIGHTFT=input(substr(HEIGHT3,1,1),3.);
run;

如果有人能告诉我哪里出了问题,那就太好了。

正如其他人在评论中所说,您遇到的错误可能是由于输入字符串中的前导空格。 处理包含数字的字符变量时,一个好的规则是在使用或从该变量提取数字之前应用left()或strip()或compress()函数

在您的示例中,使用字符串处理函数(作为输入和substr)并不是处理HEIGHT3变量的最简单方法。 可以使用SAS在数学公式中查找字符变量时应用的自动字符到数字转换

在下面的代码中,heightft公式将触发此转换,自动处理前导空格

data test;
    height3= '   508';
    heightft= int(height3/100);
    heightin= height3-(heightft*100);
run;

height3变量中存在非数字字符将导致丢失值,就像您使用input()函数一样。

您得到的错误或不希望得到的输出是什么?我想可能是前导空格的问题。.使用类似的压缩函数。.HEIGHTFT=input(substr(compress(height3),1,1),3.);您的可变高度是3个字符还是数字?如果是数字,则使用诸如HEIGHTFT=input(substr(put(HEIGHT3,3.),1,1),3.)之类的put函数;也可以使用strip函数。该代码出现错误的主要原因有三个:1)在源变量和输出变量中使用数字或字符,根据此差异使用put或input。2) substr只接受字符变量。3) 字符变量位于总长度的左侧(尾随空格),数值位于单元格长度的右侧(前导空格),如果要从num转换为char,请使用left()函数(或类似的字符串函数)。您还可以使用
cats()
——最通用、最短的函数。IMO自动类型转换是一个可怕的想法,因为它们可以隐藏其他错误,如打字错误。使用它们类似于编写错误代码。Robert,即使我通常也使用更显式的转换,但不认为自动转换隐藏了任何东西。将带有键入错误(例如“50k8”)的参数传递给
input()
和数学公式会在日志中产生相同的信息。A
注意:无效数据
后面是值列表
height3=50k8 heightft=_错误=1\N\u1