如何在满足条件后将SAS数值复制到缺少的字段中

如何在满足条件后将SAS数值复制到缺少的字段中,sas,Sas,我有一组关于医院就诊日期和就诊时间的记录,这些记录在发生方式上不一致,我想用其他日期的就诊时间来填写缺失的就诊时间 例如,某些访问日期包含访问时间,而其他日期则缺少访问时间。我的问题是:如果存在访问日期,但没有访问时间,我如何简单地将前一个访问日期(带有访问时间)中的访问时间打印到丢失的插槽中?请参阅Have和Want的图片,以获得更好的说明和描述 条件:如果就诊时间为空,则打印表中其他位置显示的就诊时间。如果就诊时间为空,并且就诊时间没有显示在文件中该日期的其他任何位置,则将其保留为空 我很好

我有一组关于医院就诊日期和就诊时间的记录,这些记录在发生方式上不一致,我想用其他日期的就诊时间来填写缺失的就诊时间

例如,某些访问日期包含访问时间,而其他日期则缺少访问时间。我的问题是:如果存在访问日期,但没有访问时间,我如何简单地将前一个访问日期(带有访问时间)中的访问时间打印到丢失的插槽中?请参阅Have和Want的图片,以获得更好的说明和描述

条件:如果就诊时间为空,则打印表中其他位置显示的就诊时间。如果就诊时间为空,并且就诊时间没有显示在文件中该日期的其他任何位置,则将其保留为空

我很好奇我是否需要合并一个循环或者只是一个if-then-print语句

''如果编码时间为ne,则打印最后一个.code\u时间中的值''

谢谢大家。 CB

拥有

想要


首先,将数据从字符转换为SAS日期和时间。这将使以后的工作更容易。将您的
输入
语句更改如下:

format code_date date9. code_time time.;
input code_date:date11. code_time:time.;
执行数据步骤时,请使用
retain
语句来保留始终保存最近时间的运行值。如果您有不应填写时间的特定条件,则可以将该逻辑添加到将
last\u code\u time
设置为缺少值或不覆盖值中

如果在遇到非缺失值之前需要填写值,则需要按
code\u日期降序code\u时间
对数据集重新排序,并使用相同的代码进行第二次传递

data want;
    set have;
    by code_date;
    retain last_code_time;

    if(first.code_date) then call missing(last_code_time);

    if(NOT missing(code_time) ) then last_code_time = code_time;
        else code_time = last_code_time;

    drop last_code_time;
run;
如果您有SAS/ETS,也可以使用
proc expand
以较少的代码完成此操作

proc expand data=want out=have(drop=time);
    by code_date;
    convert code_time / method=step;
run;

首先,将数据从字符转换为SAS日期和时间。这将使以后的工作更容易。将您的
输入
语句更改如下:

format code_date date9. code_time time.;
input code_date:date11. code_time:time.;
执行数据步骤时,请使用
retain
语句来保留始终保存最近时间的运行值。如果您有不应填写时间的特定条件,则可以将该逻辑添加到将
last\u code\u time
设置为缺少值或不覆盖值中

如果在遇到非缺失值之前需要填写值,则需要按
code\u日期降序code\u时间
对数据集重新排序,并使用相同的代码进行第二次传递

data want;
    set have;
    by code_date;
    retain last_code_time;

    if(first.code_date) then call missing(last_code_time);

    if(NOT missing(code_time) ) then last_code_time = code_time;
        else code_time = last_code_time;

    drop last_code_time;
run;
如果您有SAS/ETS,也可以使用
proc expand
以较少的代码完成此操作

proc expand data=want out=have(drop=time);
    by code_date;
    convert code_time / method=step;
run;


请您扩展您的示例,以处理上一条记录中的一种情况,即您在同一数据上有不同的时间,以及您希望在这种情况下的输出是什么。填写缺失很容易,但当你有多个选项可供选择时就更复杂了。嗨,Reeza,谢谢你的提问。如果最后一条记录在同一日期有不同的时间,则不执行任何操作。这是同一天的单独访问,将被视为单独访问。因此,在这种情况下不需要发生任何事情。这有意义吗?您应该添加一个案例,其中有上一种情况,也有丢失的数据。在Excel中键入数据并添加一些行。仅供参考-如果你发布图片,你就不太可能得到回复,因为必须有人键入你的数据才能使用它。您的最终解决方案可能会涉及延迟/保留。以
数据行
格式发布您的数据将使我们能够更快地为您提供解决方案。您是否可以扩展示例以处理上一条记录中的一种情况,即您在同一数据上有不同的时间,以及在这种情况下您希望输出的内容。填写缺失很容易,但当你有多个选项可供选择时就更复杂了。嗨,Reeza,谢谢你的提问。如果最后一条记录在同一日期有不同的时间,则不执行任何操作。这是同一天的单独访问,将被视为单独访问。因此,在这种情况下不需要发生任何事情。这有意义吗?您应该添加一个案例,其中有上一种情况,也有丢失的数据。在Excel中键入数据并添加一些行。仅供参考-如果你发布图片,你就不太可能得到回复,因为必须有人键入你的数据才能使用它。您的最终解决方案可能涉及延迟/保留。以
数据行
格式发布数据将使我们能够更快地为您提供解决方案。谢谢@Stu。代码似乎出现了一些错误。用您的建议替换输入语句时。日志状态:注意484-185:找不到格式$DATE或无法加载。它为format语句和input语句声明了此错误。请尝试删除length语句,使它们不被视为字符。删除length语句有效!现在对列进行了适当的处理。下一步,在提交您建议的保留代码之后,我没有看到任何更改。日志中没有错误。如果有帮助的话,我可以分享一个屏幕截图。代码需要运行两次:一次按原始排序的方向运行,然后按
code\u date descending code\u time
再次运行。第一次传递用于解释值之间或之后的间隙。第二次传递将填充任何初始前导缺失值。这确保了原始顺序保持在中间或尾随缺失值的位置。这是一个有趣的问题!成功了!谢谢你教我这项新技术,也谢谢你的积极参与。干杯另外,我试图推翻你的答案。谢谢你,斯图。代码似乎出现了一些错误。用您的建议替换输入语句时。日志状态:注意484-185:找不到格式$DATE或无法加载。它为format和input语句都声明了此错误。请尝试删除length语句,以便它们不被视为字符。Rem