如何将字符变量中的数字转换为sas

时间:2015-05-14 17:53:39

标签: sas

有人可以帮我解决这个问题吗?

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

RAWDATA:

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

非常感谢提前

2 个答案:

答案 0 :(得分:2)

执行此操作的简便方法(如果您知道具体的日期格式)是使用输入功能。     09:27     如果把(输入(var,?? yymmdd10。),yymmdd10。)= var那么它就是一个日期!

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

Otherwiseits a character string.

答案 1 :(得分:0)

这并不像第一眼看上去那么简单,所以我理解为什么搜索答案会很困难。只提取一个数字非常简单,但是当包含日期时,它会变得有点复杂(特别是当输入的格式可能会改变时,例如yyyy-mm-dd,dd-mm-yyyy,dd / mm / yy等)。 / p>

首先要注意的一件事。如果要将新值存储为数字字段,则无法显示数字和日期的组合。日期存储为数字并格式化以显示日期,但您不能在行级别应用格式。因此,我建议创建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;