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

Sas 具有相同后缀和前缀的和变量,sas,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 我想添加具有相同

我有以下数据集-

    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:)

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

您可以创建一个数字列数组(例如
数组num\u cols(*)\u numeric\u;
)并使用列名(
vname(num\u cols[i])
)作为
求和的条件


如果您需要更多详细信息,请告诉我。

从元数据中提取变量名列表可能是最简单的方法。您可以使用PROC内容将变量列表获取到数据集中。或从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;
然后可以使用这些列表创建摘要变量

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;

将来,当制作一系列编号的变量时,将数字部分放在末尾。这样就可以更容易地在变量列表中使用它们。

为此,我喜欢
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;

SAS有使用前缀的快捷方式,而不是后缀,所以通常只使用前缀要好得多。i、 e.如果您的变量名为Rev_AA1、Rev_AA2、Rev_BB1、Rev_BB2,那么您就不会有这个问题。我会考虑重新命名变量,如果这是一个选项。