【问题标题】:How to convert numbers in a character variable to Numeric in sas如何将字符变量中的数字转换为sas中的数字
【发布时间】:2015-05-15 17:20:18
【问题描述】:

谁能帮我解决这个问题?

我有一个非常大的原始数据集,其中包含一个字符变量,其中包含文本字符串以及以字符格式定义的数字和日期。现在我想处理数据集并创建一个新的数字变量,并且仅当实际变量中的文本是数字或日期值时才填充值。否则丢失

原始数据:

ACTUAL_VARIABLE                              NEW_NUM_VARIABLE(Expected Values)
------------------                           ---------------------------------
ODed on pills threw them all up - 2006
Y
1                                                        1
5                                                        5
ODed on pills
6                                                        6
Less than once a week
N
N
2006-11-12                                               2006-11-12

提前致谢

【问题讨论】:

  • ACTUAL_VARIABLE OD 上的药丸把它们都吐了 - 2006 年 1 5 OD 上的药丸 6 每周少于一次 N 2006-11-12 NEW_NUM_VARIABLE(预期值)1 5 6 2006-11-12
  • 欢迎来到 Stack Overflow。通常,提及您已经尝试或研究过的内容也是礼貌的做法。
  • 这个问题肯定在 StackOverflow 的其他地方得到了回答。例如,尝试搜索prxmatch

标签: sas


【解决方案1】:

最简单的方法是使用输入功能(如果您知道具体的日期格式)。 09:27 如果 put(input(var,??yymmdd10.),yymmdd10.)=var 那么它是一个日期!

else if input(var,best.) ne . then its a number.

Otherwiseits a character string.

【讨论】:

  • 谢谢吉姆。这对我有用,因为我对所有日期值都应用了 IS8601 格式。
【解决方案2】:

这并不像最初看起来那么简单,所以我理解为什么很难找到答案。仅提取一个数字很容易,但是如果包含日期,它会变得有点复杂(特别是当输入的格式可能改变时,例如 yyyy-mm-dd、dd-mm-yyyy、dd/mm/yy 等)。

首先要注意的一点。如果要将新值存储为数字字段,则不能混合显示数字和日期。日期存储为数字并格式化以显示日期,但您不能在行级别应用格式。因此,我建议创建 2 个新列,1 个用于数字,1 个用于日期。

我的首选方法是使用anyalpha 函数排除任何带有字母字符的记录,然后使用anypunct 函数来识别是否存在标点符号(这应该识别日期而不仅仅是数字)。然后使用anydtdte 信息提取日期,这是一个非常有用的信息,因为它读取以不同方式存储的日期(根据我上面的注释)。

这种方法显然有一些注意事项。

  • 如果任何数字包含小数,那么我的方法会错误地将它们视为日期,因此只会正确分配整数。
  • 它不会选择包含月份的日期,例如2015 年 5 月 15 日,因为 anyalpha 函数将排除它们。它们只需要包含数字,用任何标点符号分隔。

这是我的代码。

/* create initial dataset */
data have;
input actual_variable $ 50.;
datalines;
ODed on pills threw them all up - 2006
Y
1                                       
5                                       
ODed on pills
6                                       
Less than once a week
N
N
2006-11-12                              
;
run;

/* extract dates and numbers */
data want;
set have;
if not anyalpha(actual_variable) then do; /* exclude records with an alphabetic character */
    if anypunct(actual_variable) then new_date_variable = input(actual_variable,anydtdte10.); /* if a punctuation character exists then read in as a date */
    else new_num_variable = input(actual_variable,best12.); /* else read in as a number */
end;
format new_date_variable yymmdd10.; /* show date field in required format */
run;

【讨论】:

  • 非常感谢您的回答。这真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多