SAS:如果存在则更新数据集,否则创建它

Posted

技术标签:

【中文标题】SAS:如果存在则更新数据集,否则创建它【英文标题】:SAS: update dataset if it exists, else create it 【发布时间】:2015-07-14 16:39:37 【问题描述】:

我需要使用数据集 dt_new 更新数据集 mylib.dt_old,但我想先检查它是否确实存在,否则会出错。如果它不存在,我只想创建一个数据集 mylib.dt_old 来存储 dt_new 中包含的信息。 我尝试了以下方法:

if (exist(mylib.dt_old)) 
then do;
  data   mylib.dt_old;
  update mylib.dt_old  dt_new;
  by date var1 var2; 
  run;
end;
else do;
  data mylib.dt_old;  set dt_new;
  run;
end;

但是当 mylib.dt_old 不存在时,我得到了错误

ERROR: File MYLIB.DT_OLD.DATA does not exist.

sas 继续实际执行 else 语句(创建 dt_old 复制 dt_new)。

如果 dt_old 确实存在,我会得到 ​​p>

   if (exist(mylib.dt_old))
   --
   180
   ERROR 180-322: Statement is not valid or it is used out of proper order.

我做错了什么? PS:我是SAS的初学者。

【问题讨论】:

【参考方案1】:

您尝试执行的操作实际上符合 SAS 中的宏编程,这有时被认为是“高级”主题。

您使用的正常 if-then 控制逻辑是 SAS 认为的数据步骤代码,即它仅在数据步骤中有效。但是有一种“宏”语言看起来很相似,但以% 前缀区分。修改后的代码如下所示:

%macro updater();
    %if %sysfunc(exist(mylib.dt_old)) 
    %then %do;
        data   mylib.dt_old;
            update mylib.dt_old  dt_new;
            by date var1 var2; 
        run;
    %end;
    %else %do;
        data mylib.dt_old;
            set dt_new;
        run;
    %end;
%mend updater;
%updater()

虽然此示例有点简单,但 SAS 宏语言经常违反直觉(至少对我而言)。如果您是初学者,最好在线查找并阅读“into to SAS macros”。

【讨论】:

非常感谢,它运行良好。正如您所说,至少来自 R、matlab 等更简单的分析语言,使用 IF 控件需要宏似乎很违反直觉。

以上是关于SAS:如果存在则更新数据集,否则创建它的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:过滤,如果存在则更新文档,否则创建它

如何更新 json 类型的 json 中的任何字段?它应该接受一个对象或一个键数组,如果它存在则更新键,否则创建

如果存在则更新列数据,否则在 mysql 查询中保持不变

Mongoose 如果存在更新则获取集合数据,否则插入

根据来自另一个数据集的 PROC SQL 的结果更新 SAS 数据集

如果存在,我需要更新,否则使用 Linq 插入 SQL