Sas 如何编写一个数据步骤,从输入数据集中删除除在数据集中显式定义的变量以外的所有变量?

Sas 如何编写一个数据步骤,从输入数据集中删除除在数据集中显式定义的变量以外的所有变量?,sas,datastep,Sas,Datastep,我想使用tablefoo作为输入,并与输出数据集bar中的记录一一对应,生成一个新的SAS数据集。默认情况下,我想从foo中删除变量,但我还要求foo的所有字段都可用(以导出新变量),并且保留foo中的一些变量(如果明确指示) 我目前正在管理一个显式的变量列表,以drop=,但这会导致数据集选项声明中的语法冗长而笨拙* DATA bar (drop=id data_value2); set foo; new_id = id; data_value1

我想使用table
foo
作为输入,并与输出数据集
bar
中的记录一一对应,生成一个新的SAS数据集。默认情况下,我想从
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\u value1
new\u data
new\u-derived\u data\u value

我正在寻找一种最简洁的方法来再现与以下相同的效果:

SELECT 
  id AS new_id
  ,data_value1
  ,data_value2 * 2 AS new_derived_data_value 
FROM foo
我如何编写一个
数据
步骤,从输入数据集中删除除我在数据集中明确定义的变量以外的所有变量?


*更新:我可以使用
aaa--hhh
类型符号,但是如果变量的顺序随着时间的推移而改变,或者我以后决定保留变量
ddd
我会将变量名存储在一个宏列表中,从字典表中获取。然后,您可以在一个数据步骤中轻松地将它们全部删除。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;

我会将变量名存储在一个宏列表中,从字典表中获取。然后,您可以在一个数据步骤中轻松地将它们全部删除。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;

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

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

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

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


你不能只使用一个
keep=
来代替吗?然后我必须维护一个我想要保留的变量列表。我正在寻找从
foo
中删除所有变量的语法,同时在数据步骤中保持这些变量可用。您是否尝试过
delop
,而不是
delop
?这样就可以保留并重命名了……这是一个极其重要的区别。几乎在任何时候,您都可以使用
if(true)then output
在单个数据集数据步骤中,应改为使用
if(true),因为这会缩短执行时间,加快执行速度,并且在代码更少的情况下也会产生完全相同的效果。您不能只使用
keep=
来代替它吗?然后我必须维护一个我想要保留的变量列表。我正在寻找从
foo
中删除所有变量的语法,同时在数据步骤中保持这些变量可用。您是否尝试过
delop
,而不是
delop
?这样就可以保留并重命名了……这是一个极其重要的区别。几乎在任何时候,您都可以使用
if(true)then output
在单个数据集数据步骤中,应改为使用
if(true),因为这会缩短执行速度,如果我在
drop
语句后定义
name=name
,这会不会导致eg
name
成为输出工作,这不会有任何影响。如果答案中有drop语句,有没有办法输出名为
name
的变量?冒着违反SO规则并在注释中提出另一个问题的风险-我是否可以覆盖
删除
指令?如果我把
放下名字;保留姓名哪个优先?(顺序重要吗?)。您拥有的实际选项是数据集选项drop/keep与数据步骤drop/keep语句。在这里,您可以在data step语句中保留一组较大的内容,然后在data set选项中缩小范围(即,
data want(keep=…);
)在您的特定情况下没有帮助,因为data step中的
DROP
会阻止它进入数据集。dataset选项DROP,keep,rename,如果我在
drop
语句后定义
name=name
,那么etc按字母顺序处理会导致eg
name
被输出吗?不,那不会有任何影响。如果答案中有drop语句,有没有办法输出名为
name
的变量?冒着违反SO规则并在注释中提出另一个问题的风险-我是否可以覆盖
删除
指令?如果我把
放下名字;保留姓名哪个优先?(顺序重要吗?)。您拥有的实际选项是数据集选项drop/keep与数据步骤drop/keep语句。在这里,您可以在data step语句中保留一组较大的内容,然后在data set选项中缩小范围(即,
data want(keep=…);
)在您的特定情况下没有帮助,因为data step中的
DROP
会阻止它进入数据集。dataset选项DROP,keep,rename,其中etc按字母顺序处理