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,那么您就不会有这个问题。我会考虑重新命名变量,如果这是一个选项。