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

JMQ*_*JMQ 4 sas datastep recode

我有一个像这样的数据集(但有几百个变量):

id  q1  g7  q3  b2  zz  gl  az  tre
1   1   2   1   1   1   2   1   1
2   2   3   3   2   2   2   1   1
3   1   2   3   3   2   1   3   3
4   3   1   2   2   3   2   1   1
5   2   1   2   2   1   2   3   3
6   3   1   1   2   2   1   3   3
Run Code Online (Sandbox Code Playgroud)

我想保留ID,b2和tre,但是将其他所有内容都丢失了.在这个小的数据集中,我可以很容易地使用call missing (q1, g7, q3, zz, gl, az)- 但在一个包含更多变量的集合中,我实际上想说call missing (of _ALL_ *except ID, b2, tre*).

显然,SAS无法读懂我的想法.我考虑过涉及另一个数据步骤或proc sql的变通方法,我将原始变量复制到新的ds并将它们合并回post,但我正在尝试找到更优雅的解决方案.

dat*_*ll_ 8

此技术使用未执行的set语句(仅编译时间函数)来定义原始数据集中的所有变量.保持顺序和所有变量属性类型,标签,格式等.基本上将所有变量设置为缺失.将执行的下一个SET语句仅引入不要设置为缺失的变量.它没有明确地将变量设置为缺失,但实现了相同的结果.

   data nomiss;
       input id  q1  g7  q3  b2  zz  gl  az  tre;
       cards;
    1   1   2   1   1   1   2   1   1
    2   2   3   3   2   2   2   1   1
    3   1   2   3   3   2   1   3   3
    4   3   1   2   2   3   2   1   1
    5   2   1   2   2   1   2   3   3
    6   3   1   1   2   2   1   3   3
    ;;;;
       run;
    proc print;
       run;
    data manymiss;
       if 0 then set nomiss;
       set nomiss(keep=id b2 tre:);
       run;
    proc print;
       run;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 好答案.如果你解释它为什么有用会更好 - 我怀疑很多中级程序员很难理解只看代码(至于为什么`如果0'有效). (2认同)