【问题标题】:SAS, converting numbers, from character format to numeric format, keeping all leading zeros, but length of numbers is NOT uniformSAS,将数字从字符格式转换为数字格式,保留所有前导零,但数字的长度不统一
【发布时间】:2020-10-27 22:21:31
【问题描述】:

我在 SAS EG 工作,我正在尝试将字符格式的列转换为数字格式,与它们以字符格式显示的完全一样。这些数字的长度各不相同,有些数字有一个或两个前导零。

如果我采用一种方式,它会去掉所有前导零。我尝试的另一种方法是,它将前导零添加到它与列中最长的数字一样长的程度,例如,一个前导零的 9 位数字现在有四个前导零,因为列中的最长数字是 12 位. (我希望这个描述有意义)。

我在 SAS EG 工作。当我运行 proc 内容时,它告诉我我现有的变量是一个长度为 26 的字符变量。'format' 和 'informat' 都是空白的。

我需要对其进行转换,以便新列是长度为 8 和“F12”的数字变量。对于“格式”和“BEST12”。对于“信息”,因为我打算用它来匹配两个数据集。

我在“常规”SAS 中创建了以下测试数据集,但我不确定是否完全重现了我在 SAS EG 中处理的问题:

data have;
input mrn $1-12;
cards;
118283586928
003875807
038087875
0385709873
0038576830
;
run;

如您所见,我有一个 12 位长的数字(没有前导零);两个是 9 位数字(带有一个或两个前导零);和两个是 10 位数字(带有一个或两个前导零)。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 你说“我打算用它(char值转换为数值)来匹配两个数据集”。匹配数值时不考虑数字格式,因此您可能可以摆脱这个兔子洞。
  • 在带有字符版本值的表中,前导零是否重要?那就是'00012''12' 意味着两种不同的情况?
  • 前导零对数字没有意义,它们只是为了显示,根本问题是什么?您最初是从哪里获得这些数据的?

标签: sas type-conversion leading-zero


【解决方案1】:

您不能将 26 位字符串完全存储为 SAS 中的数字。 SAS 将数字存储为浮点值。您可以使用 CONSTANT() 函数来查看可以精确存储的连续整数的结尾。

73    data _null_;
74     x=constant('exactint');
75     put x= comma30.;
76    run;

x=9,007,199,254,740,992

因此,如果您在字符变量中确实有超过 15 位的值,您将无法将它们转换为数字。

但如果它们只有 12 位长,那么只需将字符串转换为数字并比较数字即可。

proc sql;
  create table want as 
    select * 
    from a, b
    where a.mrn = input(b.mrn_string,32.)
  ;
quit;

【讨论】:

    【解决方案2】:

    在 SAS 的同一列中不可能有不同的格式。在同一列中保持它们看起来完全一样的唯一方法是将它们保留为文本。如果您需要对它们进行计算,我建议您只使用它们的数值创建第二列。

    可以使用 z 将前导零添加到数字中。格式。

    https://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000205244.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      相关资源
      最近更新 更多