Sas 如何编写一个数据步骤,从输入数据集中删除除在数据集中显式定义的变量以外的所有变量?
我想使用tableSas 如何编写一个数据步骤,从输入数据集中删除除在数据集中显式定义的变量以外的所有变量?,sas,datastep,Sas,Datastep,我想使用tablefoo作为输入,并与输出数据集bar中的记录一一对应,生成一个新的SAS数据集。默认情况下,我想从foo中删除变量,但我还要求foo的所有字段都可用(以导出新变量),并且保留foo中的一些变量(如果明确指示) 我目前正在管理一个显式的变量列表,以drop=,但这会导致数据集选项声明中的语法冗长而笨拙* DATA bar (drop=id data_value2); set foo; new_id = id; data_value1
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
,这会不会导致egname
成为输出工作,这不会有任何影响。如果答案中有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按字母顺序处理会导致egname
被输出吗?不,那不会有任何影响。如果答案中有drop语句,有没有办法输出名为name
的变量?冒着违反SO规则并在注释中提出另一个问题的风险-我是否可以覆盖删除
指令?如果我把放下名字;保留姓名代码>哪个优先?(顺序重要吗?)。您拥有的实际选项是数据集选项drop/keep与数据步骤drop/keep语句。在这里,您可以在data step语句中保留一组较大的内容,然后在data set选项中缩小范围(即,data want(keep=…);
)在您的特定情况下没有帮助,因为data step中的DROP
会阻止它进入数据集。dataset选项DROP,keep,rename,其中etc按字母顺序处理