0

我想生成一个新的 SAS 数据集,使用表foo作为输入并与输出数据集中的记录一一对应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_value1,new_datanew_derived_data_value.

我正在寻找重现相同效果的语法上最简洁的方法:

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

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

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

4

2 回答 2

3

我会将变量名称存储在从 DICTIONARY 表中获取的宏列表中。然后,您可以在数据步骤中轻松地将它们全部删除。例如

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;
于 2014-09-11T14:41:34.743 回答
1

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

data want;
  set class;
  drop name--weight;
  name1=name;
  age1=age;
run;
于 2014-09-11T14:48:26.790 回答