如何在SAS中自动进行子集化?

时间:2015-04-27 07:40:37

标签: sas

我是SAS的新手,所以这可能是一个愚蠢的问题。 假设有几个结构相似但列名不同的数据集。我想获得具有相同行数但只有列子集的新数据集。 在以下示例中,Data_AData_B是原始数据集,SubASubB是我想要的。推导SubASubB的有效方式是什么?

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; 

1 个答案:

答案 0 :(得分:2)

这是我的新答案。这引入了很多概念,但所有这些都是完成这项任务所必需的。

首先,我将在新数据集中存储所需的部分变量名称(所有数据集共有的后缀)。这样可以将它们保存在一个位置,并在需要时更容易更改。

下一步是创建一个正则表达式(正则表达式)搜索字符串,它结合了所有名称,用管道(|)分隔,这是or的正则表达式符号。我还在名称的末尾添加了一个$符号,这样可以确保只选择以部件名称结尾的变量。 select into :[macroname]是在proc sql

中创建宏变量的方法

然后我设置一个宏来提取当前数据集的特定变量名称,并使用这些名称创建一个视图(就像我的原始答案) dictionary中引用的proc sql库是一个元数据库,其中包含有关所有活动库,表,列等的信息,因此可以很好地识别实际变量名称的调用(基于前面创建的正则表达式搜索字符串。)

您的代码中不需要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);