如何在SAS中自动生成子集?
我是SAS的新手,所以这可能是一个愚蠢的问题。 假设有多个数据集具有相似的结构,但列名不同。我希望获得具有相同行数但只有一部分列的新数据集。 在下面的示例中,如何在SAS中自动生成子集?,sas,Sas,我是SAS的新手,所以这可能是一个愚蠢的问题。 假设有多个数据集具有相似的结构,但列名不同。我希望获得具有相同行数但只有一部分列的新数据集。 在下面的示例中,Data\u A和Data\u B是原始数据集,SubA和SubB是我想要的。导出SubA和SubB的有效方法是什么 DATA A_auto; LENGTH A_make $ 20; INPUT A_make $ 1-17 A_price A_mpg A_rep78 A_hdroom A_trunk A_weight A_lengt
Data\u A
和Data\u B
是原始数据集,SubA
和SubB
是我想要的。导出SubA
和SubB
的有效方法是什么
DATA A_auto;
LENGTH A_make $ 20;
INPUT A_make $ 1-17 A_price A_mpg A_rep78 A_hdroom A_trunk A_weight A_length A_turn A_displ A_gratio A_foreign;
CARDS;
AMC Concord 4099 22 3 2.5 11 2930 186 40 121 3.58 0
AMC Pacer 4749 17 3 3.0 11 3350 173 40 258 2.53 0
Audi Fox 6295 23 3 2.5 11 2070 174 36 97 3.70 1
;
RUN;
DATA B_auto;
LENGTH make $ 20;
INPUT B_make $ 1-17 B_price B_mpg B_rep78 B_hdroom B_trunk B_weight B_length B_turn B_displ B_gratio B_foreign;
CARDS;
Toyota Celica 5899 18 5 2.5 14 2410 174 36 134 3.06 1
Toyota Corolla 3748 31 5 3.0 9 2200 165 35 97 3.21 1
VW Scirocco 6850 25 4 2.0 16 1990 156 36 97 3.78 1
;
RUN;
DATA SubA;
set A_auto;
keep A_make A_price;
RUN;
DATA SubB;
set B_auto;
keep B_make B_price;
RUN;
这是我的新答案。这引入了很多概念,但这些都是完成此任务所必需的 首先,我将在一个新的数据集中存储所需的部分变量名(所有数据集通用的后缀)。这将使它们保持在一个位置,并且在需要时更容易更改 下一步是创建一个正则表达式(regex)搜索字符串,该字符串组合了所有名称,由管道(|)分隔,管道是
或
的正则表达式符号。我还在名称的末尾添加了一个$符号,这确保只选择以零件名称结尾的变量。
select into:[macroname]
是在proc sql
然后我设置了一个宏来提取当前数据集的特定变量名,并使用这些名称创建一个视图(就像我原来的答案一样)
proc sql
中引用的字典
库是一个元数据库,包含所有活动库、表、列等的信息,因此是识别实际变量名的良好来源(基于先前创建的regex搜索字符串)
您不需要在代码中使用proc print
,我只是把它放进去以显示一切都按预期工作
让我知道这是否适合你
/* create intial datasets */
DATA A_auto;
LENGTH A_make $ 20;
INPUT A_make $ 1-17 A_price A_mpg A_rep78 A_hdroom A_trunk A_weight A_length A_turn A_displ A_gratio A_foreign;
CARDS;
AMC Concord 4099 22 3 2.5 11 2930 186 40 121 3.58 0
AMC Pacer 4749 17 3 3.0 11 3350 173 40 258 2.53 0
Audi Fox 6295 23 3 2.5 11 2070 174 36 97 3.70 1
;
RUN;
DATA B_auto;
LENGTH B_make $ 20;
INPUT B_make $ 1-17 B_price B_mpg B_rep78 B_hdroom B_trunk B_weight B_length B_turn B_displ B_gratio B_foreign;
CARDS;
Toyota Celica 5899 18 5 2.5 14 2410 174 36 134 3.06 1
Toyota Corolla 3748 31 5 3.0 9 2200 165 35 97 3.21 1
VW Scirocco 6850 25 4 2.0 16 1990 156 36 97 3.78 1
;
RUN;
/* create dataset containing partial name of variables to keep */
data keepvars;
input part_name $ :20.;
datalines;
_make
_price
;
run;
/* create regular expression search string from partial names */
proc sql noprint;
select
cats(part_name,'$') /* '$' matches end of string */
into
:name_str separated by '|' /* '|' is an 'or' search operator in regular expressions */
from
keepvars;
quit;
%put &name_str.; /* print search string to log */
/* macro to create views from datasets */
%macro create_views (dsname, vwname); /* inputs are dataset name being read in and view name being created */
/* extract specific variable names to be kept, based on search string */
proc sql noprint;
select
name
into
:vars separated by ' '
from
dictionary.columns
where
libname = 'WORK'
and memname = upper("&dsname.")
and prxmatch("/&name_str./",strip(name))>0; /* prxmatch is regular expression search function */
quit;
%put &vars.; /* print variables to keep to log */
/* create views */
data &vwname. / view=&vwname.;
set &dsname. (keep=&vars.);
run;
/* test view by printing */
proc print data=&vwname.;;
run;
%mend create_views;
/* run macro for each dataset */
%create_views(A_auto, SubA);
%create_views(B_auto, SubB);
谢谢你的回答。但是仍然需要为所有现有数据集定义视图。我有20个数据集,每个数据集中需要50列。一个接一个地定义所有视图和变量需要很长时间。好吧,你的问题在这方面不清楚。我需要知道的是,在每个数据集中,所有50列的命名约定是否相似(例如,根据您的示例,第1列始终以_make结尾)。如果是这样的话,那么我可以给你一个宏观的解决方案。我想你的问题的答案是肯定的。我的意思是这些名字很相似。它们以不同的字母开头(如A代表第一个字母,B代表第二个字母),但都以相同的名字结尾(如本例中的_make)。非常感谢。我是SAS的初学者,所以我不能掌握你代码的每一部分。不过,我还是设法对代码进行了调整,使其适用于我的实际数据集。很高兴它起到了作用,我很感激它为初学者提供了很多帮助!之后花一点时间阅读所使用的各种概念是值得的,毫无疑问,你将来还会需要它们。元数据(字典)表可以看作是SASHELP库中的视图。我使用的表(
dictionary.columns
)存储为sashelp.vcolumn
。我使用的另一个主要表是sashelp.vtable
(或dictionary.tables
),请注意,SAS对前缀有命名/列出快捷方式,但对后缀没有。因此,如果您对变量命名有任何控制权,那么最好使用诸如Price_a、Price_B之类的命名约定。