【问题标题】:SAS Converting Characters/Number to NumbersSAS将字符/数字转换为数字
【发布时间】:2014-09-22 16:05:00
【问题描述】:

我正在寻找一种在 SAS 中将字符转换为数字的方法,以便我可以使用 max 函数。此外,如果保留字符且仅保留数字,这将很有帮助。下面是 SAS 表中列的数据列表。

列 UNK
abc20140714
abc20140714x
abc20140714xyz
123_abc20140714_xyz
abc20150718

从列中删除数值后,我将对数据进行分组并使用 SAS 中的 max 函数,它应该只生成值 20150718。

为了避免任何混淆,我的问题是,有没有办法去除非数字值,然后将列转换为数字列,以便我可以使用 max 函数?

谢谢。

【问题讨论】:

    标签: sas


    【解决方案1】:

    要获取以 1 或 2 作为数值开头的一行中的第一个 8 位数字序列,可以使用以下命令:

    data want;
        set have;
        pos = prxmatch("/[12]\d{7}/", character_string);
        if pos > 0 then number = input(substr(character_string, pos, 8), 8.);
        else number = .;
        drop pos;
    run;
    

    prxmatch 表达式找到序列的起始位置,substr 表达式提取序列,然后输入函数将其转换为数字。

    (已编辑以纳入乔的反馈)

    【讨论】:

      【解决方案2】:

      当然!

      var_num = input(compress(var_char,,'kd'),yymmdd8.);
      

      压缩从列表中删除或保留字符。 'kd' 说“保留数字”。

      然后您使用适当的信息输入; yymmdd8. 根据您提供的数据看起来不错。然后应用format var_num yymmdd8n.; 或类似格式,使其在视觉上看起来像一个日期(即使它下面真的是一个数字)。

      正如所指出的,如果值中有 other 数字,这将不起作用;您需要查看您的数据并确定这些数据的显示方式并分别清理它们。例如,您可以使用正则表达式来识别具有 8 个连续数字的事物,从 20 开始;但最终,根据您的数据需要处理这些问题是一个数据分析问题。

      【讨论】:

      • 好答案,唯一的问题是它似乎不适用于“123_abc20140714_xyz”,因为 123 被保留为数字的一部分。
      • 我应该已经解决了这个问题,但我认为这超出了这个问题的范围,因为它是一个与主要问题不同的数据问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多