我想使用表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_value1
,new_data
和new_derived_data_value
。
我正在寻找以最简洁的方式再现同样的效果:
SELECT
id AS new_id
,data_value1
,data_value2 * 2 AS new_derived_data_value
FROM foo
如何编写DATA
步骤,除了我在数据集中明确定义的变量外,将删除输入数据集中的所有变量?
*更新:我可以使用aaa--hhh
类型表示法,但如果变量的顺序随着时间的推移而变化,或者我后来决定保留变量ddd
,那么即使这样也很难实现。
答案 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;