【问题标题】:How to copy a SAS numeric value into missing fields after meeting conditions满足条件后如何将 SAS 数值复制到缺失字段中
【发布时间】:2020-09-28 16:05:25
【问题描述】:

我有一组医院就诊日期和就诊时间不一致的记录,我想用其他日期的就诊时间填补缺失的就诊时间。

例如,一些访问日期有访问时间,而另一些则缺少访问时间。我的问题是:如果存在访问日期但没有访问时间,我怎样才能简单地将先前访问日期(带有访问时间)的访问时间打印到该丢失的插槽中?请查看 Have 和 Want 的图片以获得更好的说明和描述。

条件:如果访问时间为空白,则打印出现在表中其他地方的访问时间。如果访问时间为空白,并且文件中该日期的其他任何地方都没有出现访问时间,则将其保留为空白。

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

'''if code_time ne then print the values in the last.code_time'''

data want;
infiles datalines;
length code_date $50. code_time $9.;
input code_date code_time;
datalines;
19-AUG-2010 .
19-AUG-2010 .
19-AUG-2010 16:56:00
20-AUG-2010 .
20-AUG-2010 17:12:00
23-AUG-2010 13:10:00
23-AUG-2010 13:19:00
26-AUG-2010 .
30-AUG-2010 19:30:00
09-SEP-2010 .
03-DEC-2010 .
;
quit;
run;

谢谢大家。 CB

想要

【问题讨论】:

  • 您能否扩展您的样本以处理您上一条记录中的情况,即您在同一数据上有不同的时间,以及您期望在这种情况下的输出。填写缺失很容易,但当您有多个选项可供选择时,情况会更加复杂。
  • 嗨,Reeza,感谢您的提问。如果最后一条记录在同一日期有不同的时间,则什么也不做。这是同一天的单独访问,将被视为同一天。因此,在这种情况下不需要发生任何事情。这有意义吗?
  • 您应该添加一个案例,其中您有最后一种情况并且也缺少数据。
  • 在 Excel 中输入您的数据并添加一些行。仅供参考 - 如果您发布图片,则不太可能得到回复,因为有人必须输入您的数据才能使用它。您的最终解决方案可能会涉及延迟/保留。
  • datalines 格式发布您的数据将使我们能够更快地为您提供解决方案。

标签: sas


【解决方案1】:

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

format code_date date9. code_time time.;
input code_date:date11. code_time:time.;

在执行数据步骤时,使用retain 语句来保持始终保持最新时间的运行值。如果您有不应该填写时间的特定条件,您可以添加该逻辑以将 last_code_time 设置为缺失或不覆盖值。

如果在遇到非缺失值之前需要填写值,您需要按 code_date descending code_time 重新对数据集进行排序,并使用相同的代码进行第二次传递。

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;

【讨论】:

  • 谢谢@Stu。似乎代码正在拉出一些错误。用您的建议替换输入语句时。日志状态:注意 484-185:格式 $DATE 未找到或无法加载。它为格式和输入语句声明了此错误。
  • 尝试删除长度语句,以免它们被视为字符。
  • 删除长度语句有效!现在可以适当地处理列。下一步,在提交您建议的保留代码后,我没有观察到任何更改。日志中不存在错误。如果有帮助,我可以分享屏幕截图吗?
  • 代码将需要运行两次:一次在最初的排序方向,然后在code_date descending code_time 重新排序后再次运行。第一遍考虑了值之间或之后的差距。第二遍填充任何初始前导缺失值。这可确保原始订单保留在中间或尾随缺失值的位置。
  • 这太迷人了!有效!感谢您教我这项新技术并感谢您的积极参与。干杯! PS。我试图赞成你的回答。我的声望
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多