美文网首页
如何批量删除SAS数据集中的特定变量--Call Execute

如何批量删除SAS数据集中的特定变量--Call Execute

作者: 野藤_ | 来源:发表于2020-04-18 17:28 被阅读0次

    假设WORK逻辑库中有10个数据集,其中8个数据集存在的变量var1、var2,但不知晓具体是哪8个数据集。现在要将这两个变量从这8个数据集中删除,如何实现这个效果呢?

    首先,从变量中删除变量常用的就是data步中的drop语句,我们可以针对每一个数据集写一个data步删掉这两个变量,简单粗暴。只要对这8个数据集重复下面的代码就好。但是,这里有两个问题。第一,我不知道具体是哪8个数据集含有这两个变量;第二,数据集可能含有其中一个变量,drop语句删除两个变量会报error,这个如何处理。严格意义上,我们得对这10个数据集都进行这样的操作,才能确保万无一失。在这样的情况下,对没有这两个数据集进行这样的操作,程序运行也会出现error,出现这样的error后,再修改代码,可以实现这个功能。这显得一点也不智能,而且,这样的代码也不够稳定,如果下次数据中var1、var2变动,也要重新修改代码。 删除var1和var2

    那有没有稍微“智能”的操作,可以自动找出这8个数据集并且删掉这两个变量的方法呢?答案是有的。因为对每一个数据集的操作都是相同的,每次代码变动的部分就是数据集的名称,那我们将这个操作重复8次,每次只改变数据集名称以及要删除变量的名称不就好了?

    这里一个关键点,我得先找出含有var1、var2变量的数据集。这里,我们通过SAS字典来实现,SAS字典中包含的描述各个逻辑库下数据集的元数据信息,我们用SQL来访问SAS字典。例如,我想找出WORK逻辑库下含有变量var1或var2的数据集名称,我使用以下代码进行演示,先看下代码和运行结果。

    输出WORK逻辑库中包含变量var1和var2的数据集名称 输出结果

    可以看到WORK逻辑库中包含var1和var2变量的数据集名称都保存在输出数据集中。接下来就是针对每一个数据集进行删除对应的变量。具体到删除变量,最基础的操作一定是第一张图片的代码的样式,现在要想办法将数据集名称和要删除的代码名称“填”到示例代码中。如何操作呢?第一个想法,直接把数据集名称和变量名读进宏变量直接引用;这里我们介绍另一个方法,使用call execute语句。

    Call execute语句

    EXECUTE,照着字面意思理解,就是执行语句。上面的代码就是执行引号内的文字内容,不过,由于数据集有4行数据,所以这样的语句会执行4次,日志结果如下:

    Call execute日志结果1

    这里的代码还可以进一步改进,上面的每一次代码执行只删除一个变量,如果要删除两个变量,要执行两次,那可不可以缩减成一次完成呢?这里将每个数据集中要删除的变量名整合到一个变量中,并且以空格间隔。我们可以使用Transpose过程步,先把竖向数据转化成横向,然后再进行拼接。

    竖向转横向代码--Transpose 转换结果1

    除了Transpose过程步,还可以在Data步中用Retain语句实现这样的拼接效果。

    竖向转横向代码--Retain 转换结果2

    这样处理之后,时候Call execute语句时,针对每一个数据集只需一次运行代码,实现批量删除特定变量。


    Call execute日志结果2

    对SAS字典不熟悉的人可能对前面的操作有一些疑惑,我们可以输出SAS字典的内容,进行观察理解。我在写上面代码的时候,遗忘了数据集中变量的名称,也是先输出完整的SAS字典内容,查看具体变量名称后再进行后续编程。


    查看字典Columns的内容 内容展示

    由于输出窗口大小的原因,我只截取前面几个变量。Columns字典中包含libname(逻辑库名)、memname(数据集名)、matatype(变量类型)、name(变量名称)等描述变量属性的数据。通过这张表就很容易理解前面代码的筛选步骤了。

    相关文章

      网友评论

          本文标题:如何批量删除SAS数据集中的特定变量--Call Execute

          本文链接:https://www.haomeiwen.com/subject/pcrbvhtx.html