SAS 将结果输出到输入数据集(输入和输出数据集名称相同)

标签 sas datastep

我找不到有关此问题的信息,或者无法正确指定问题。

让我用代码提问:
是这个操作

data work.tmp;
    set work.tmp;
    * some changes to data here;
run;

或者特别是

proc sort data = work.tmp out = work.tmp;
    by x;
run;

在 SAS 中是否有任何危险,或者被认为是不好的做法?请注意相同的输入和输出数据集名称,这是我的要点。 SAS 是否正确处理这种情况,以便运行此类数据步骤/过程时不会出现不明确的结果?

最佳答案

后者,自行分类,是相当频繁的;因为排序只是重新排列数据集,并且(除非您依赖于其他顺序,或者除非您使用 where 子句来过滤数据集或重命名/保留/删除选项)不会'不会对数据集造成任何永久性损害,只要 tmp 正在工作(或打算用作工作目录的 libname),这就不被认为是不好的做法。 SAS 创建一个临时文件来进行排序,成功后会删除旧文件并重命名临时文件;不存在重大腐败风险。

前者在数据步骤中将数据集设置为自身,通常不被认为是一个好的做法。这是因为数据步骤通常会执行一些不可逆转的操作 - 即,如果您运行它一次,它会产生与再次运行它不同的结果。因此,您可能不知道您的数据集处于什么状态;而使用排序时,您可以依赖于知道,因为如果大多数时候没有正确排序,您会得到一个明显的错误,而对于数据步骤,您可能永远不知道。因此,每个数据步骤通常应该生成一个新的数据集(至少对于该线程来说是新的)。有时有必要这样做,或者至少不这样做会造成很大的浪费 - 也许宏有时会执行长数据步骤,有时则不会 - 但通常您可以围绕它进行编程。

不过,从文件系统会变得困惑的意义上来说,这并不危险;与sort类似,SAS只会创建一个临时文件,填充新数据集,然后删除旧数据集并重命名临时文件。

(我不提诸如 modify 之类的事情,它必须将数据集设置为自身,因为这有一个明显的答案......)

关于SAS 将结果输出到输入数据集(输入和输出数据集名称相同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32046225/

相关文章:

sas - 创建一个扫描列表的列

sas - SAS中的IF-THEN与IF

date - 将 csv 导入 SAS 时无法正确设置日期格式

sas - 将 *most* 变量设置为缺失,同时保留少数几个的内容

sql - SAS 数据步骤/SQL 从多个具有相同 ID 的记录中选择最新记录

sas将表格插入html电子邮件

text - 在导出SAS数据的数据步骤中表达 "PUT all variables"

sas - 通过两列创建行号列 SAS

sas - 如何消除 SAS 中缺少结果的变量?