【问题标题】:SAS create new variable that is the first digit of an existing variableSAS创建新变量,它是现有变量的第一位
【发布时间】:2015-05-04 02:45:50
【问题描述】:

我正在处理一些 SAS 代码并遇到了问题。我正在尝试使用体重和身高计算 6000 多名患者的 BMI(因此不能选择数据线)。高度当前输入为 508(5 英尺、08 英寸等),每个 obs。所以我想我会尝试结合 substr 和 input 语句从 3 位代码中提取第一个数字,然后对英寸执行相同的操作。当我拥有这两个新变量时,我将能够完成剩下的工作,但我似乎无法让这个特定的数据步骤发挥作用。

这就是我所拥有的:

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

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

【问题讨论】:

  • 您得到什么错误或不需要的输出?
  • 我想这可能是前导空格的问题。使用这样的压缩函数 ..HEIGHTFT=input(substr(compress(HEIGHT3),1,1),3.);
  • 您的变量 HEIGHT3 是字符还是数字?如果它是数字,则使用像 HEIGHTFT=input(substr(put(HEIGHT3,3.),1,1),3.); 这样的 put 函数也可以使用strip函数。
  • 该代码出现错误的主要原因有以下三个: 1) 源变量和输出变量中的数字或字符,根据此差异使用 put 或 input。 2) substr 只接受 char 变量。 3) 字符变量在总长度的左侧(尾随空格),数字在单元格长度的右侧(前导空格),如果要从 num 转换为,请使用 left() 函数(或类似的字符串函数)字符

标签: sas


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 您也可以使用cats() - 最通用和最短的功能。 IMO 自动类型转换是一个可怕的想法,因为它们可以隐藏其他错误,例如拼写错误。使用它们类似于编写错误代码。
  • 罗伯特,即使我通常使用更明确的转换,但不认为自动转换隐藏任何东西。将带有拼写错误的参数(例如“50k8”)传递给input() 和数学公式会在日志中产生相同的信息。 NOTE: invalid data 后跟值列表 height3=50k8 heightft=. _ERROR_=1 _N_=1
猜你喜欢
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 2014-08-05
  • 2018-06-05
  • 2017-10-23
  • 1970-01-01
相关资源
最近更新 更多