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

如何在sas中将字符变量中的数字转换为数字,sas,Sas,有人能帮我解决这个问题吗 我有一个非常大的原始数据集,其中包含一个字符变量,该变量包含文本字符串以及以字符格式定义的数字和日期。现在,我想处理数据集并创建一个新的数值变量,并且仅当实际变量中的文本是数字或日期值时才填充值。否则会丢失 原始数据: ACTUAL_VARIABLE NEW_NUM_VARIABLE(Expected Values) ------------------ ---

有人能帮我解决这个问题吗

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

原始数据:

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
提前多谢

简单的方法(如果您知道具体的日期格式)是使用输入功能。 09:27 如果put(输入值(var,?yymmdd10.),yymmdd10.)=var,则为日期

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

Otherwiseits a character string.

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

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

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

这种方法显然存在一些警告

  • 如果任何数字包含小数,那么我的方法将错误地将这些数字视为日期,因此只有整数将被正确分配
  • 它不会选择包含月份的日期作为单词,例如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;

实际变量ODed on pills将它们全部抛出-2006 Y 15 ODed on pills 6每周少于一次N 2006-11-12新的变量ODed on pills(期望值)1 5 6 2006-11-12欢迎使用堆栈溢出。通常,提及您已经尝试或研究过的内容是礼貌的。StackOverflow上的其他地方肯定回答了这个问题。例如,尝试搜索
prxmatch
。非常感谢您的回答。这真的很有帮助。谢谢吉姆。这对我很有用,因为我对所有日期值都应用了IS8601格式。