具有相同后缀和前缀的和变量

时间:2017-11-21 14:31:44

标签: sas

我有以下数据集 -

    Col1    Rev_1_AA    Rev_2_AA    Rev_3_AA    Rev_1_BB    Rev_2_BB    Rev_3_BB
    A   2   7   2   8   9   4
    B   5   8   6   9   9   1
    C   6   1   4   7   8   10
    D   10  5   5   3   10  4
    E   7   5   5   8   3   4

我想添加具有相同前缀和后缀的列(Rev; AA和Rev; BB)。这只是一个示例数据,我有100个像这样的列来手动完成。

我希望输出像这样 -

    Col1    Rev_AA  Rev_BB
    A   11  21
    B   19  19
    C   11  25
    D   20  17
    E   17  15

我已经能够使用以下代码对基础前缀求和 -

    sum(of Rev:)

但不能同时使用前缀和后缀。任何帮助都会很棒。谢谢!

3 个答案:

答案 0 :(得分:3)

从元数据中提取变量名列表可能最简单。您可以使用PROC CONTENTS将变量列表导入数据集。或者从SAS的内部元数据表中提取。因此,如果您的源数据集名为WORK.HAVE,那么您可以使用这样的代码来获取变量列表。

proc sql noprint;
%let listaa=;
%let listbb=;
select name into :listaa separated by ' '
  from dictionary.columns
  where libname='WORK' and memname='HAVE'
    and upcase(name) like 'REV^_%^_AA' escape '^'
;  
select name into :listbb separated by ' ' 
  from dictionary.columns
  where libname='WORK' and memname='HAVE'
    and upcase(name) like 'REV^_%^_BB' escape '^'
;  
quit;

然后,您可以使用这些列表来创建摘要变量。

data want;
  set have ;
  sum_aa = sum(of &listaa);
  sum_bb = sum(of &listbb);
run;

将来制作一系列编号的变量时,将数字部分放在最后。然后,它们可以更容易地用在变量列表中。

答案 1 :(得分:0)

您可以创建一个数字列数组(例如array num_cols(*) _numeric_;)并使用列名(vname(num_cols[i]))作为sum的条件。

如果您需要更多详细信息,请与我们联系。

答案 2 :(得分:0)

我喜欢PROC TRANSPOSE。它比Tom的解决方案更多的数据操作,因此对于运行时问题的大型数据集来说,这可能并不理想,但它非常灵活。

data have;
input id  $  Rev_1_AA    Rev_2_AA    Rev_3_AA    Rev_1_BB    Rev_2_BB    Rev_3_BB;
datalines;
    A   2   7   2   8   9   4
    B   5   8   6   9   9   1
    C   6   1   4   7   8   10
    D   10  5   5   3   10  4
    E   7   5   5   8   3   4
;;;;
run;

proc transpose data=have out=have_t;
  by id;
run;

data want_pre/view=want_pre;
  set have_t;
  by id;
  prefix = scan(_name_,1,'_');
  suffix = scan(_name_,-1,'_');
run;

proc means data=want_pre noprint;
  by id;
  class prefix suffix;
  types prefix*suffix;
  output out=want sum(col1)=;
run;

proc transpose data=want out=want_t;
  by id;
  var col1;
  id prefix suffix;
run;