我有以下数据集 -
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:)
但不能同时使用前缀和后缀。任何帮助都会很棒。谢谢!
答案 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;