如何编写一个DATA步骤,除了我在数据集中明确定义的变量之外,它将从输入数据集中删除所有变量?

时间:2014-09-11 12:43:29

标签: sas datastep

我想使用表foo作为输入生成新的SAS数据集,并与输出数据集bar中的记录一一对应。我默认删除foo中的变量,但我还要求foo的所有字段都可用(以获取新变量),并且还要保留foo中的某些变量(如果明确指出)。

我目前正在为drop=管理一个明确的变量列表,但它会在数据集选项声明中产生冗长且难以处理的语法。*

DATA bar (drop=id data_value2);
set foo;

new_id                 = id;
data_value1            = data_value1;     /* Explicitly included for clarity */
new_derived_data_value = data_value2 * 2; /* etc. */

format new_id                  $fmt_id.
       data_value1             $fmt_dat.
       new_derived_data_value  $fmt_ddat.
;
RUN;

我想要的输出表应该只包含字段data_value1new_datanew_derived_data_value

我正在寻找以最简洁的方式再现同样的效果:

SELECT 
  id AS new_id
  ,data_value1
  ,data_value2 * 2 AS new_derived_data_value 
FROM foo

如何编写DATA步骤,除了我在数据集中明确定义的变量外,将删除输入数据集中的所有变量?

*更新:我可以使用aaa--hhh类型表示法,但如果变量的顺序随着时间的推移而变化,或者我后来决定保留变量ddd,那么即使这样也很难实现。

2 个答案:

答案 0 :(得分:3)

我会将变量名存储在从DICTIONARY表中获取的宏列表中。然后,您可以在数据步骤中轻松删除它们。 e.g。

proc sql noprint;
select name into :vars separated by ' '
from dictionary.columns
where libname = 'SASHELP' and memname='CLASS';
quit;

data want (drop=&vars.);
set sashelp.class;
name1=name;
age1=age;
run;

答案 1 :(得分:1)

Keith的解决方案是最好的生产解决方案,但假设您知道数据集中的第一个和最后一个变量,这是一个快速的替代方案:

data want;
  set class;
  drop name--weight;
  name1=name;
  age1=age;
run;