2015-10-06 65 views
0

我正在从应用统计和SAS编程的练习12.6。注释:使用列输入,读取NAME,GENDER和DOB,其中NAME在第1-10列中,Gender在第12列中,DOB在第13-22列中。请注意,对于列输入,您必须将出生日期作为字符读取。你可以使用下面的例子(我试图写这个)。阅读数据行后缺少数据

a)将出生日期定义为角色是一个好主意吗?为什么? 我的回答:不,不是一个好主意,因为我们可以使用这个日期,在其他更进一步的方程中以直接的方式进行计算。

b)将DOB从字符更改为数字并计算该人的实际日期。

我试着用这个代码来解决这个问题:

DATA PROB12_6;                               

INPUT  NAME $ 1-10                             
      GENDER $ 12                             
      DOB $ MMDDYY10. 13-22;                            

AGE=yrdif(input(dob,mmddyy10.),today(), 'Age');                       

DATALINES;                                
      1   2    



Cody  M05/11/1981                             
McMaster F11/11/1967                             
Bill Smith M12/25/1999                             
;                                  


PROC PRINT DATA=PROB12_6 (FIRSTOBS=4);                         
RUN; 

我的产量只有名字,在其他变量空值。

我研究了使用绝对列指针,但我没有运气。

+0

欢迎。请充分解释您的目标以及您的预期产出。您是否正在通过示例使用Learning SAS:Ron Cody的程序员指南?这可能有助于添加完整的标题。 – LJW

+0

DOB不应作为字符读取,日期以数字形式存储。你可能在日志中收到错误,你可以发布吗? – Reeza

+0

是的,这是事实,但如果我没有曲解练习说的话,必须输入类似的字符,然后在代码中改变它并使用它来计算年龄。但是我卡在打印部分,只有打印名称。我希望现在更清楚。谢谢。 – DarioC

回答

0

第一个问题:

DOB $ 13-22;                   

这里取下格式。您正在初始化一个字母数字变量,并尝试将其格式化为数字日期,因此无法在此处对其进行格式化。

问题二:

这也许这里是一个形式问题stackexchange,但我复制你的代码,并得到这个工作,我不得不使用这个值(性别是第13位):

INPUT  NAME $ 1-10 
      GENDER $ 13 
      DOB $ 14-23; 

当我测试时,结果为此:

      . 
Cody  M 05/11/1981 34.405479452 
McMaster F 11/11/1967 47.901369863 
Bill Smith M 12/25/1999 15.780821918 
+0

谢谢!我无法获得程序中的实际年龄,是否有任何额外的代码,以便使用数据行中的数据计算年龄? – DarioC

+0

@darioc我没有使用这个结果的extracode,只是粘贴你的代码和我的答案中的2个变化。也许你应该发布日志,如果你仍然没有结果。我猜它是一个范围问题。或者我误解了你的评论,你的意思是别的吗?yrdif还会在前4个日期中抛出错误(因为它们不是真正的日期值)。也许你必须在这里降低你的错误设置,或者在调用yrdif之前检查dob的正确日期格式 – kl78