有人可以帮我解决这个问题吗?
我有一个非常大的原始数据集,其中包含一个字符变量,其中包含文本字符串以及数字&以字符格式定义的日期。现在我想处理数据集并创建一个新的数字变量,并仅在实际变量中的文本是数字或日期值时填充值。否则失踪
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
非常感谢提前
答案 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
信息提取日期,这是一个非常有用的信息,因为它读取以不同方式存储的日期(根据我上面的注释)。
这种方法显然有一些警告。
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;