數組並不像那樣工作。當他們不是的時候,你使用它們就好像它們是宏變量一樣。
因此,您不能在宏變量上使用:
後綴。您可以通過幾種方法之一來完成此操作。首先,你可以簡單地把所有的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