如何在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

我是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_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之类的命名约定。