数组并不像那样工作。当他们不是的时候,你使用它们就好像它们是宏变量一样。
因此,您不能在宏变量上使用:
后缀。您可以通过几种方法之一来完成此操作。首先,你可以简单地把所有的sales
变量放到一个数组中,然后按照你喜欢的顺序循环遍历这两个变量,然后用VNAME
和一些帮助来比较变量名。
Data test_sum;
ARRAY weekDays{*} Monday Tuesday Wednesday Thursday Friday Saturday Sunday;
set test;
array sales sales_:;
do i=1 to DIM(weekDays);
do j = 1 to dim(sales);
if upcase(compress(scan(vname(sales[j]),2,'_'),,'ka')) = upcase(vname(weekdays[i]))
then weekdays[i] = sum(weekdays[i],sales[j]);
end;
end;
drop i j;
run;
这是相当低效的,因为你做一吨不必要的比较,所以,这可能是不适合你,如果你有一个大的数据集。这可能是一个小数据集的正确答案。
对于大型数据集,您应该使用宏语言来代替。
%macro sum_weekday(name=);
%let weekday = %sysfunc(compress(%sysfunc(scan(&name.,2,_)),,ka));
&weekday. = sum(&weekday., &name.);
%mend sum_weekday;
proc sql;
select cats('%sum_weekday(name=',name,')') into :sumlist separated by ' '
from dictionary.columns
where memname='TEST' and libname='WORK'
;
quit;
data test_macro;
set test;
&sumlist;
run;
这是非常有效,因为它只是每行的变量列表看一次,一次也没有。基本上,它只是创建然而,许多类的语句
monday = sum(monday, sales_monday1);
monday = sum(monday, sales_monday2);
tuesday= sum(tuesday,sales_tuesday);
等等,基于dictionary.columns
这是您的SAS所有表中的变量列表。 (如果您处于服务器环境中,并且通过元数据服务器定义大量库,则可能会很慢;您可以使用其他方法来执行此操作。)
来源
2017-10-09 02:32:12
Joe
如果您可以选择更改数据结构,我怀疑长数据格式可能更有用。你可以在这里查看一些问题和好处:https://cran.r-project.org/web/packages/tidyr/vignettes/tidy-data.html – Reeza